MySQL如何筛选内连接后最后一条关联备注匹配指定内容的流程
MySQL单条SQL查询实现方案
完全可以用单条SQL实现需求,以下提供两种适配不同MySQL版本的写法:
方案1:MySQL 8.0及以上版本(窗口函数实现,性能更优)
通过ROW_NUMBER()窗口函数给每个流程的备注按创建时间倒序编号,取编号为1的最新备注筛选内容后关联流程表:
SELECT DISTINCT p.* FROM processes p INNER JOIN ( SELECT process_id, content, -- 按流程分组,备注创建时间倒序编号,编号为1就是该流程最新的备注 ROW_NUMBER() OVER (PARTITION BY process_id ORDER BY creation_date DESC) AS rn FROM notes ) latest_note ON p.id = latest_note.process_id WHERE latest_note.rn = 1 -- 内容包含指定文本用LIKE,完全匹配直接用 = 'some_content' AND latest_note.content LIKE '%some_content%';
方案2:兼容MySQL 5.x及更低版本
先通过分组查询拿到每个流程的最新备注创建时间,再关联定位到对应备注筛选后关联流程表:
SELECT DISTINCT p.* FROM processes p -- 关联备注表 INNER JOIN notes n ON p.id = n.process_id -- 关联子查询拿到的每个流程最新备注的创建时间 INNER JOIN ( SELECT process_id, MAX(creation_date) AS max_create_date FROM notes GROUP BY process_id ) t ON n.process_id = t.process_id AND n.creation_date = t.max_create_date WHERE n.content LIKE '%some_content%';
注意事项
如果存在同一流程同一个creation_date有多条备注的场景,上述SQL会返回所有符合内容要求的同时间最新备注对应的流程,符合业务逻辑。
内容的提问来源于stack exchange,提问作者R0m1
相关产品推荐
相关产品推荐

