跨表关联分组:非外键字段分组获取各项目最新反馈
解决方案
针对你的需求——按project_id分组,获取每个分组下的最新反馈记录,提供两种可行的SQL写法:
方法一:窗口函数实现(MySQL 8.0+ 适用)
利用窗口函数对每个project_id下的反馈按创建时间倒序排序,直接筛选出最新的那条:
SELECT t.id AS feedback_id, t.created_at, t.entity_id, t.project_id FROM ( SELECT f.id, f.created_at, e.id AS entity_id, e.project_id, ROW_NUMBER() OVER (PARTITION BY e.project_id ORDER BY f.created_at DESC) AS row_rank FROM feedback f INNER JOIN entity e ON f.entity_id = e.id ) t WHERE t.row_rank = 1;
这个方法会给每个project_id下的反馈按created_at从新到旧编号,取编号为1的记录,确保每个分组只返回一条最新反馈(即使同时间有多条,也只会取排序后的第一条)。
方法二:子查询匹配最新时间(兼容MySQL 5.x)
如果你的数据库版本不支持窗口函数,可以先通过子查询获取每个project_id对应的最新反馈创建时间,再关联回原表拿到具体记录:
SELECT f.id AS feedback_id, f.created_at, e.id AS entity_id, e.project_id FROM feedback f INNER JOIN entity e ON f.entity_id = e.id INNER JOIN ( SELECT e.project_id, MAX(f.created_at) AS latest_time FROM feedback f INNER JOIN entity e ON f.entity_id = e.id GROUP BY e.project_id ) latest ON e.project_id = latest.project_id AND f.created_at = latest.latest_time;
注意:如果同一个
project_id下存在多条反馈在同一时间创建,这个写法会返回所有这些记录。若需要唯一结果,可以在子查询中结合MAX(f.id)进一步筛选(前提是id的生成逻辑和时间顺序一致)。
说明
你原SQL中的RIGHT JOIN会包含未关联到Entity表的Feedback记录,但这类记录没有对应的project_id,不符合需求,因此改用INNER JOIN只保留有对应实体的反馈数据。
内容的提问来源于stack exchange,提问作者peter.cambal
相关产品推荐
相关产品推荐

