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

如何在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;

逻辑说明:

  1. 子查询先按原帖分组,计算每个分组的最大date_time(也就是该原帖最新版本的时间)。
  2. 将原表与子查询结果关联,找到每个原帖对应最新时间的那条记录。

执行结果验证

运行上述任意查询后,都会得到你期望的输出:

| 1 | a question | NULL | 1464136759 |
| 4 | my answer eduted again | 2 | 1464136762 |

内容的提问来源于stack exchange,提问作者Martin AJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:39:07