如何在MySQL中选取帖子的最后编辑版本?
获取帖子的最新版本查询方案
要实现始终选取每个指定原帖(包括其编辑版本)的最新记录,你可以用以下两种方案来实现,适配不同的数据库版本:
方法一:使用窗口函数(推荐,现代SQL兼容)
这种方案逻辑清晰、可读性强,适合支持窗口函数的数据库(比如MySQL 8.0+、PostgreSQL、SQL Server等):
WITH latest_posts AS ( SELECT *, -- 按原帖分组(原帖用自身ID,编辑版用edited_id),按时间倒序排序,最新记录标记为1 ROW_NUMBER() OVER (PARTITION BY COALESCE(edited_id, id) ORDER BY date_time DESC) AS rn FROM posts -- 筛选目标原帖的所有相关记录(原帖+所有编辑版) WHERE COALESCE(edited_id, id) IN (1, 2) ) -- 只保留每个分组里标记为1的最新记录 SELECT id, body, edited_id, date_time FROM latest_posts WHERE rn = 1 ORDER BY date_time ASC;
逻辑说明:
COALESCE(edited_id, id):把原帖(edited_id为NULL)和它的所有编辑版本(edited_id指向原帖ID)归为同一个分组,分组标识就是原帖的ID。ROW_NUMBER() OVER (...):在每个分组内按date_time降序排序,最新的记录会被标记为rn=1。- 最后筛选
rn=1的记录,就是每个目标原帖的最新版本,再按时间升序排列即可得到期望结果。
方法二:使用分组子查询(兼容老版本数据库)
如果你的数据库不支持CTE(公共表表达式)或窗口函数,可以用这种兼容性更强的方案:
SELECT p.* FROM posts p JOIN ( -- 先统计每个原帖对应的最新时间 SELECT COALESCE(edited_id, id) AS original_id, MAX(date_time) AS latest_date FROM posts WHERE COALESCE(edited_id, id) IN (1, 2) GROUP BY COALESCE(edited_id, id) ) latest ON (COALESCE(p.edited_id, p.id) = latest.original_id AND p.date_time = latest.latest_date) ORDER BY p.date_time ASC;
逻辑说明:
- 子查询先按原帖分组,计算每个分组的最大
date_time(也就是该原帖最新版本的时间)。 - 将原表与子查询结果关联,找到每个原帖对应最新时间的那条记录。
执行结果验证
运行上述任意查询后,都会得到你期望的输出:
| 1 | a question | NULL | 1464136759 | | 4 | my answer eduted again | 2 | 1464136762 |
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

