【问题标题】:MySQL LEFT JOIN With a GROUP BY and aggregate operators chokesMySQL LEFT JOIN 使用 GROUP BY 和聚合运算符阻塞
【发布时间】:2019-01-05 04:40:38
【问题描述】:

我在 MySQL 中有两个表:ALUMNI 和 CALLRES。

ALUMNI 表以 AlumID 作为其主键。它有 14483 条记录。

CALLRES 表将 CallKey 作为其主键,并且它有一个字段 AlumID 即被索引。 (它是 ALUMNI 的外键,但没有指定的正式约束。) CALLRES 有大约 18000 个记录。

以下查询可以正常工作。 (0.2 秒,14461 个结果行)

 SELECT    ALUMNI.AlumID, MAX(CALLRES.CallTime), COUNT(CALLRES.Outcome)
 FROM      ALUMNI JOIN CALLRES ON (ALUMNI.AlumID = CALLRES.AlumID)
 GROUP BY  ALUMNI.AlumID

但是,没有列出没有 CALLRES 记录的 ALUMNI。 (数量不多:目前错过了 14483 - 14461 = 22。)

我想让它们在列表中,所以我想要一个 LEFT JOIN 而不是一个 JOIN。我猜添加的记录在聚合列中会有 NULL。

这是否允许?

当我通过将“JOIN”更改为“LEFT JOIN”来更改查询时,我没有收到错误消息,但查询会无限期地存在。所以:

 SELECT    ALUMNI.AlumID, MAX(CALLRES.CallTime), COUNT(CALLRES.Outcome)
 FROM      ALUMNI LEFT JOIN CALLRES ON (ALUMNI.AlumID = CALLRES.AlumID)
 GROUP BY  ALUMNI.AlumID

需要“永远”。感谢您的建议。

【问题讨论】:

  • 与所有相关表的 SHOW CREATE TABLE 语句一样,有关查询性能的问题总是需要对给定查询进行解释

标签: mysql group-by left-join aggregate-functions


【解决方案1】:

如果你想得到缺失的列表,你可以这样做:

SELECT ALUMNI.AlumID
FROM   ALUMNI LEFT JOIN CALLRES ON (ALUMNI.AlumID = CALLRES.AlumID)
WHERE  CALLRES.AlumID IS NULL

SELECT ALUMNI.AlumID FROM ALUMNI
WHERE ALUMNI.AlumID NOT IN (SELECT AlumID FROM CALLRES)

我认为第一个 SQL 更好。

【讨论】:

  • 感谢您的建议。我认为您是正确的,这些可以解决我的问题。但我希望有人能用我的方法解释什么是错误的,如果有的话。我很好奇为什么我的 LEFT JOIN 查询会扼杀 MySQL ......尤其是因为它轻而易举地通过自然 JOIN 查询。
猜你喜欢
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多