从多个查询创建视图

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 示例,它显示了这一点。 太棒了!再次感谢您抽出宝贵时间回复,您对我帮助很大。

以上是关于从多个查询创建视图的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库视图创建以及优点分析

Azure SQL - 通过多个数据库查询创建视图

mysql多表查询并创建视图

从 mysql 中的查询创建视图 - mysql 不允许创建视图

SQLite进阶-17.视图

如何从多个视图创建摘要视图?