【问题标题】:Joining the same subquery twice in MySQL在 MySQL 中两次加入相同的子查询
【发布时间】:2020-01-31 02:44:00
【问题描述】:

我有两个子查询,它们会产生一个固定装置列表和一个用户拥有管理员权限的团队列表。

我可以这样做,必须为团队列表调用两次相同(相当复杂)的子查询,如下所示:


(SELECT hometeam, awayteam etc... ) as fixtures

LEFT JOIN (SELECT team_id, admin etc... ) as teams1 ON fixtures.hometeam = teams1.team_id
LEFT JOIN (SELECT team_id, admin etc... ) as teams2 ON fixtures.awayteam = teams2.team_id

有没有一种方法可以使用团队列表查询的别名而不必执行两次?

【问题讨论】:

  • 正如斯宾塞在下面的回答所说,您只能在更新的 MySQL 版本中真正做到这一点,它们添加了对 CTE 的支持。在此版本之前,唯一真正的选择是创建一个表(虽然不是真正的 TEMPORARY 表),用子查询的结果填充它,并使用该表代替子查询,然后在完成后删除中间表。 .. 并且您需要注意多个客户端不会同时尝试执行此操作(至少使用相同的中间表名称)。

标签: mysql subquery alias


【解决方案1】:

MySQL 8.0 引入了对通用表表达式 (CTE) 的支持

请注意,早期版本的 MySQL 不支持此功能,即在 5.7、5.6 中不可用,

https://dev.mysql.com/doc/refman/8.0/en/with.html

类似这样的:

WITH
  teams AS (SELECT team_id, admin etc... )
SELECT ...
  FROM (SELECT hometeam, awayteam etc... ) AS fixtures
  LEFT
  JOIN teams t1 
    ON t1.team_id = fixtures.hometeam
  LEFT 
  JOIN teams t2
    ON t2.team_id = fixtures.awayteam
 WHERE ...

对于 8.0 之前的 MySQL 版本,不支持 CTE 的版本,无法多次引用同一个内联视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多