从多个查询创建视图

时间:2013-12-17 18:39:02

标签: mysql sql view

我目前正在使用数据库中的以下表格执行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 个答案:

答案 0 :(得分: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;

样本输出(在两种情况下):

| SEXO |        TIPO |
|------|-------------|
|    f |     entrada |
|    m | rolls_fondo |

这是 SQLFiddle 演示