mysql - 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
需要“永远”。感谢您的任何建议。
解决方案
如果你想得到缺失的列表,你可以这样做:
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 更好。
推荐阅读
- r - R Markdown将不同的表格打印到环境
- google-colaboratory - OSError:无法读取数据(文件读取失败:...错误消息='输入/输出错误'...)
- c - 机器人的 C 编程
- javascript - 使用“import * as jQuery”时出现“TypeError: $ is not a function”
- javascript - 我想在来自 React Native 中的 API 的数组中添加一个值
- blazor - 在 Blazor 服务器应用程序中如何以及在何处实现 JsInterop javascript 端?
- angular - Object(...) 不是 Function.DominoAdapter.makeCurrent 的函数
- laravel - 如何设置 morphTo() 参数
- c# - 创建具有多个一对多关系和 DeleteBehavior 的实体
- angular - Rxjs: Observables 和 Subjects 排序