MySQL 5.7按Registry分组筛选最大IDMovement且IDCausal为21的行
解决方案:按Registry分组取最大IDMovement行并筛选IDCausal=21
针对你在MySQL 5.7中的需求,这里提供两种可行的查询方法,都能实现按Registry分组,只返回每组中IDMovement最大且IDCausal=21的行(无符合条件的组则不返回):
方法一:子查询获取每组最大IDMovement
先通过子查询算出每个Registry对应的最大IDMovement,再关联两张表筛选出目标记录:
SELECT m.IDMovement, mo.IDCausal, m.Registry FROM registry m JOIN movement mo ON m.IDMovement = mo.IDMovement JOIN ( SELECT Registry, MAX(IDMovement) AS max_id FROM registry GROUP BY Registry ) AS max_movement ON m.Registry = max_movement.Registry AND m.IDMovement = max_movement.max_id WHERE mo.IDCausal = 21;
逻辑说明:
- 子查询
max_movement按Registry分组,计算每组的最大IDMovement值 - 外层查询关联registry、movement和子查询结果,确保只拿到每组中IDMovement最大的那一行
- 最后通过
WHERE mo.IDCausal = 21过滤,仅保留符合条件的记录
方法二:使用NOT EXISTS自关联判断最大行
通过自关联查询判断当前行是否为该Registry下IDMovement最大的行,再筛选IDCausal条件:
SELECT m.IDMovement, mo.IDCausal, m.Registry FROM registry m JOIN movement mo ON m.IDMovement = mo.IDMovement WHERE NOT EXISTS ( SELECT 1 FROM registry m2 WHERE m2.Registry = m.Registry AND m2.IDMovement > m.IDMovement ) AND mo.IDCausal = 21;
逻辑说明:
NOT EXISTS子查询会检查:当前Registry下是否存在IDMovement比当前行更大的记录- 如果不存在,说明当前行就是该Registry下IDMovement最大的行
- 同样通过
AND mo.IDCausal = 21筛选出符合要求的结果
结合你的示例:当Registry=2SST0160的最大IDMovement行对应的IDCausal为5时,两种查询都不会返回该行;若IDCausal为21,则会返回这一行。
内容的提问来源于stack exchange,提问作者g-pane
相关产品推荐
相关产品推荐

