首页 > 解决方案 > MySQL LEFT JOIN 与 GROUP BY 和聚合运算符阻塞

问题描述

我在 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

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

标签: mysqlgroup-byleft-joinaggregate-functions

解决方案


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

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 更好。


推荐阅读