如何使用 UNION 和子 SELECT 从查询构造 MySQL 视图

Posted

技术标签:

【中文标题】如何使用 UNION 和子 SELECT 从查询构造 MySQL 视图【英文标题】:How to construct MySQL view from query with UNIONs and sub-SELECTs 【发布时间】:2015-03-10 18:36:04 【问题描述】:

我正在尝试构建一个看似普通的报告,以显示我玩过的哪些彩票的号码与已公布的一个或多个中奖抽奖匹配。我有下面的查询,它完全符合我在 SQL 提示符下的要求。但是,我需要将其表示为 VIEW,以便我的单个 ODBC 连接可以访问两个单独的数据库,但我无法弄清楚如何在不需要 UNION 的情况下设置单独的子视图。谁能告诉我一个更好的方法?感谢指导。

SELECT record_id, GROUP_CONCAT(num ORDER BY num) nums
FROM (
      SELECT record_id, n1 num FROM LA.tickets UNION
      SELECT record_id, n2 num FROM LA.tickets UNION
      SELECT record_id, n3 num FROM LA.tickets UNION
      SELECT record_id, n4 num FROM LA.tickets UNION
      SELECT record_id, n5 num FROM LA.tickets
     ) foo
    WHERE num = ANY ((SELECT n1 n FROM L.draw WHERE record_id = 1) UNION
                     (SELECT n2 n FROM L.draw WHERE record_id = 1) UNION
                     (SELECT n3 n FROM L.draw WHERE record_id = 1) UNION
                     (SELECT n4 n FROM L.draw WHERE record_id = 1) UNION
                     (SELECT n5 n FROM L.draw WHERE record_id = 1)
                )
    GROUP BY record_id
    HAVING count(*) >= 1;

(在这种情况下,“抽奖”表的第 1 条记录包含最近抽出的 5 个号码。

【问题讨论】:

为什么不能在此之前添加CREATE VIEW 的东西? 这正是我的问题——我不知道该怎么做。我需要一个 VIEW 来提供与 SELECT 查询相同的结果,但我不确定如何将其分解为组件。 (对你的问题的简短回答是我现在特别厚。) 【参考方案1】:

嗯,mysql create view 的快速 google 将我带到 http://dev.mysql.com/doc/refman/5.0/en/create-view.html,它给了我这样的语法(只需逐字复制/粘贴您的 SELECT 语句):

CREATE VIEW foo AS
SELECT record_id, GROUP_CONCAT(num ORDER BY num) nums
FROM (
      SELECT record_id, n1 num FROM LA.tickets UNION
      SELECT record_id, n2 num FROM LA.tickets UNION
      SELECT record_id, n3 num FROM LA.tickets UNION
      SELECT record_id, n4 num FROM LA.tickets UNION
      SELECT record_id, n5 num FROM LA.tickets
     ) foo
    WHERE num = ANY ((SELECT n1 n FROM L.draw WHERE record_id = 1) UNION
                     (SELECT n2 n FROM L.draw WHERE record_id = 1) UNION
                     (SELECT n3 n FROM L.draw WHERE record_id = 1) UNION
                     (SELECT n4 n FROM L.draw WHERE record_id = 1) UNION
                     (SELECT n5 n FROM L.draw WHERE record_id = 1)
                )
    GROUP BY record_id
    HAVING count(*) >= 1;

【讨论】:

不,这根本没有帮助,@peter-bowers。我熟悉 CREATE VIEW 语法。我一直在寻找的是与 MySQL 下的 VIEW 约束兼容的查询逻辑的替代结构。为了使这个查询工作,我需要使用 MySQL 视图不允许的结构。 Ref: (bit.ly/1Caerpp) 我认为主要的问题是我的表结构不好。在给它一个规范化擦洗后,我将重新审视这个问题。不过,感谢您的回复。

以上是关于如何使用 UNION 和子 SELECT 从查询构造 MySQL 视图的主要内容,如果未能解决你的问题,请参考以下文章

hive UNION和子查询

使用UNION ALL和子查询和变量的MySQL错误

mysql sql优化之expain

如何在此 SELECT 语句中使用 EXISTS 和子查询 [关闭]

MySQL 执行计划说明

mysql性能分析工具