MYSQL查询今日患者预约仅关联最新一条预约记录问题排查
问题原因
- 执行顺序逻辑错误:SQL中
GROUP BY的执行优先级高于ORDER BY,原语句先按患者ID分组,再对分组后的结果排序。分组阶段对于非分组字段、未使用聚合函数包裹的字段(如a.DT、a.DoctorID),MySQL在关闭ONLY_FULL_GROUP_BY模式时会默认取分组匹配到的第一条记录,也就是你示例中更早的预约记录,后续排序无法改变分组阶段已经取到的旧数据。 - 语法不符合标准规范:未对SELECT列表中的非分组字段使用聚合函数,属于MySQL的非标准兼容语法,开启
ONLY_FULL_GROUP_BY模式或切换到其他关系型数据库时会直接执行报错。
解决方案
方案1:全版本兼容写法(支持MySQL5.x、8.x及多数主流数据库)
先通过子查询查询出每个患者当日最大的预约时间,再关联预约表和患者表获取完整信息:
SELECT a.PatientID, a.DoctorID, a.DT, p.id, p.Name FROM appointment a INNER JOIN Patient p ON p.id = a.PatientID INNER JOIN ( SELECT PatientID, MAX(DT) AS latest_dt FROM appointment WHERE DATE(DT) = CURDATE() GROUP BY PatientID ) t ON a.PatientID = t.PatientID AND a.DT = t.latest_dt WHERE DATE(a.DT) = CURDATE() ORDER BY a.DT DESC;
方案2:窗口函数写法(仅支持MySQL8.0及以上版本)
使用ROW_NUMBER()窗口函数按患者分组,按预约时间倒序排序后取每个分组的第一条记录即可:
SELECT PatientID, DoctorID, DT, id, Name FROM ( SELECT a.PatientID, a.DoctorID, a.DT, p.id, p.Name, ROW_NUMBER() OVER (PARTITION BY a.PatientID ORDER BY a.DT DESC) AS rn FROM appointment a INNER JOIN Patient p ON p.id = a.PatientID WHERE DATE(a.DT) = CURDATE() ) tmp WHERE rn = 1 ORDER BY DT DESC;
内容的提问来源于stack exchange,提问作者NuM3
相关产品推荐
相关产品推荐

