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

关联Event与Version表并分组,调整排序,获取每个事件的最新版本

获取每个Event对应的最新Version的正确做法

嘿,我来帮你搞定这个问题!你当前的查询其实存在两个关键问题:

  1. 用GROUP BY e.event_id却直接SELECT *,这在多数SQL的严格模式(比如MySQL的ONLY_FULL_GROUP_BY)下是不允许的——非聚合列要么得放进GROUP BY里,要么得用聚合函数处理,不然数据库没法确定返回哪条记录的值。
  2. 你的查询根本没实现“取最新version”的逻辑,GROUP BY在这里只是把相同event_id的记录归组,但没法筛选出每个组里最新的那条。

结合你给出的表结构和测试数据,我给你两种靠谱的实现方式:

方法1:子查询先找每个event_id的最新记录

先通过子查询找出每个event_id对应的最新更新时间(或者如果event.id是自增主键,用最大id来判断更高效),再关联原表和Version表拿到完整数据:

按更新时间筛选

SELECT e.*, v.*
FROM events.event e
INNER JOIN events.version v ON e.version_id = v.id
INNER JOIN (
    -- 先找出每个event_id的最新更新时间
    SELECT event_id, MAX(updated) AS latest_updated
    FROM events.event
    GROUP BY event_id
) AS latest_events ON e.event_id = latest_events.event_id 
                  AND e.updated = latest_events.latest_updated;

按自增ID筛选(如果id是自增的,推荐这个)

如果event.id是自增的,最新的记录id肯定最大,用这个方式性能更好:

SELECT e.*, v.*
FROM events.event e
INNER JOIN events.version v ON e.version_id = v.id
INNER JOIN (
    SELECT event_id, MAX(id) AS latest_id
    FROM events.event
    GROUP BY event_id
) AS latest_events ON e.id = latest_events.latest_id;

方法2:用窗口函数(适合支持的数据库,比如MySQL8+、PostgreSQL、SQL Server等)

窗口函数ROW_NUMBER()能给每个event_id分组内的记录排个序,直接取排序第一的就是最新的那条,逻辑更清晰:

SELECT *
FROM (
    SELECT e.*, v.*,
           -- 按event_id分组,每组内按更新时间倒序排,给每条记录标序号
           ROW_NUMBER() OVER (PARTITION BY e.event_id ORDER BY e.updated DESC) AS row_num
    FROM events.event e
    INNER JOIN events.version v ON e.version_id = v.id
) AS ranked_events
-- 只取每组的第一条(最新记录)
WHERE row_num = 1;

针对你测试数据的结果

看你给的测试数据:

  • EVENT表中event_id=2有两条记录,updated分别是06/06/2018和02/07/2018(按月/日/年解析的话,6月6日比2月7日晚),所以event_id=2的最新记录是id=2,关联Version表的id=8;
  • event_id=1只有一条记录,关联Version表的id=7。

如果你的日期格式是日/月/年(比如02/07/2018是7月2日),那event_id=2的最新记录就是id=3,关联Version表的id=9,只要确保数据库能正确解析你的日期格式,排序就没问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:39:03