You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:45:03