从多个查询创建视图
Posted
技术标签:
【中文标题】从多个查询创建视图【英文标题】:Create view from multiple queries 【发布时间】:2013-12-17 18:39:01 【问题描述】:我目前正在使用数据库中的以下表执行 sql 脚本:
菜单表(包含有关菜肴的信息):
+----------+--------------+--------+-------------+
| id_plato | nombre_plato | precio | tipo |
+----------+--------------+--------+-------------+
| 1 | peces | 100 | entrada |
| 2 | caca | 20 | rolls_fondo |
| 3 | plato1 | 200 | bajativo |
| 4 | plato2 | 200 | entrada |
| 5 | plato3 | 200 | entrada |
| 6 | plato4 | 200 | entrada |
| 7 | plato5 | 200 | entrada |
| 8 | plato6 | 200 | entrada |
| 9 | plato7 | 200 | entrada |
| 10 | plato8 | 200 | entrada |
| 11 | plato9 | 200 | entrada |
| 12 | plato10 | 200 | entrada |
| 13 | plato11 | 200 | entrada |
| 14 | plato1 | 200 | entrada |
+----------+--------------+--------+-------------+
Boleta 表(包含所有销售信息):
+-----------+------+--------------+
| id_boleta | sexo | precio_final |
+-----------+------+--------------+
| 1 | m | 1 |
| 2 | f | 1 |
| 3 | f | 1 |
| 4 | m | 1 |
+-----------+------+--------------+
BoletaDetalle 表(包含在给定销售中购买的每道菜的信息):
+------------+-----------+----------+----------------+
| id_detalle | id_boleta | id_plato | precio_detalle |
+------------+-----------+----------+----------------+
| 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 1 |
| 3 | 1 | 2 | 1990 |
| 4 | 2 | 1 | 5 |
| 5 | 3 | 4 | 1 |
| 6 | 4 | 2 | 1 |
| 7 | 5 | 4 | 1 |
| 8 | 4 | 2 | 1 |
+------------+-----------+----------+----------------+
基本上,这是一个小餐馆的小程序,我被要求通过一个 sql 脚本显示一个快速报告,该脚本显示一个包含特定客户群最喜欢的菜的视图。例如,根据客户的性别如下:
| Sex | Type |
+------------------+
| M | entrada |
| F | bajativo |
尽管这是一项简单的任务,但我在尝试解决这个问题时遇到了很多麻烦。
这是我目前所拥有的:
DROP VIEW IF EXISTS v1;
CREATE VIEW v1 (Tipo, CantidadMujer, CantidadHombre)
AS
SELECT m.tipo as Tipo, COUNT(bd.id_plato) as 'Cantidad Mujer', COUNT(bd2.id_plato) as 'Cantidad Hombre'
FROM Menu m
LEFT JOIN BoletaDetalle bd
INNER JOIN Boleta b
on (bd.id_boleta = b.id_boleta AND b.sexo = 'f')
on bd.id_plato = m.id_plato AND m.tipo = 'entrada'
LEFT JOIN BoletaDetalle bd2
INNER JOIN Boleta b2
on (bd2.id_boleta = b2.id_boleta AND b2.sexo = 'm')
on bd2.id_plato = m.id_plato AND m.tipo = 'entrada'
GROUP BY(m.tipo);
SELECT * FROM v1;
我正在考虑创建一个类似于上述视图的视图,其中包含每个性别(每种菜肴类型)购买的菜肴数量,然后通过获取每个类别的最大值来创建第二个视图(最后一个)。我真的迷路了,所以任何帮助都将不胜感激。
【问题讨论】:
【参考方案1】:你在寻找这样的东西吗?
CREATE VIEW sexo_tipo_view AS
SELECT b.sexo, m.tipo, COUNT(d.id_plato) total
FROM boletadetalle d JOIN boleta b
ON d.id_boleta = b.id_boleta JOIN menu m
ON d.id_plato = m.id_plato
GROUP BY b.sexo, m.tipo
ORDER BY sexo, total DESC;
CREATE VIEW sexo_tipo_favorites_view AS
SELECT sexo, tipo
FROM sexo_tipo_view
GROUP BY sexo;
SELECT s.sexo, COALESCE(v.tipo, '-') tipo
FROM
(
SELECT 'f' sexo UNION ALL
SELECT 'm'
) s LEFT JOIN sexo_tipo_favorites_view v
ON s.sexo = v.sexo;
或没有视图
SELECT s.sexo, COALESCE(v.tipo, '-') tipo
FROM
(
SELECT 'f' sexo UNION ALL
SELECT 'm'
) s LEFT JOIN
(
SELECT sexo, tipo
FROM
(
SELECT b.sexo, m.tipo, COUNT(d.id_plato) total
FROM boletadetalle d JOIN boleta b
ON d.id_boleta = b.id_boleta JOIN menu m
ON d.id_plato = m.id_plato
GROUP BY b.sexo, m.tipo
ORDER BY sexo, total DESC
) a
GROUP BY sexo
) v
ON s.sexo = v.sexo;
样本输出(两种情况下):
|性交 | TIPO | |--------|----------| | f |内达 | |米 | rolls_fondo |这里是SQLFiddle演示
【讨论】:
非常感谢,这正是我想要的。我将深入研究代码,因为乍一看它似乎真的让我感到困惑,如果你不介意我可能会问几个问题。再次感谢您! 不客气 :) 不要犹豫,提出后续问题。 我遇到了一个问题。如果我清除数据库并插入仅限女性的销售,它将不会显示男性客户的统计数据(显然因为没有包含男性客户的销售)。是否有解决方法来检测这一点并可能在 TIPO 上加上“-”? 您需要为此使用COALESCE()
或IFNULL()
函数。请参阅更新的答案。这是一个新的sqlfiddle 示例,它显示了这一点。
太棒了!再次感谢您抽出宝贵时间回复,您对我帮助很大。以上是关于从多个查询创建视图的主要内容,如果未能解决你的问题,请参考以下文章