SQLite中如何为每个外键选取对应的最新单条记录
为SQLite中每个x_fk获取最新评分记录的解决方案
针对你的需求,这里提供几种可靠的实现方式:
方法一:分组子查询关联(兼容所有SQLite版本)
利用自增主键y_pk的唯一性是最稳妥的方式(避免同一x_fk在同一时间有多条评分的情况):
SELECT y.* FROM y INNER JOIN ( SELECT x_fk, MAX(y_pk) AS latest_pk FROM y GROUP BY x_fk ) AS latest_y ON y.y_pk = latest_y.latest_pk;
如果更依赖date字段判断最新,也可以用MAX(date)替代MAX(y_pk),但注意若同一x_fk在同一时间有多个评分,会返回多条匹配记录:
SELECT y.* FROM y INNER JOIN ( SELECT x_fk, MAX(date) AS latest_date FROM y GROUP BY x_fk ) AS latest_y ON y.x_fk = latest_y.x_fk AND y.date = latest_y.latest_date;
方法二:窗口函数(SQLite 3.25.0及以上版本支持)
窗口函数写法逻辑更直观,能灵活定义排序规则,确保每个x_fk仅返回一条最新记录:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY x_fk ORDER BY date DESC, y_pk DESC) AS rn FROM y ) AS ranked_y WHERE rn = 1;
这里通过PARTITION BY x_fk按x_fk分组,ORDER BY date DESC, y_pk DESC确保先按日期倒序排列,日期相同时取主键更大的记录,最后筛选出每个分组的第一条数据(rn=1)。
关联表x获取完整信息
如果需要同时展示表x中项的名称,可用LEFT JOIN关联,确保即使x表中的项没有评分记录也能被列出:
SELECT x.x_pk, x.name, y.rating, y.date FROM x LEFT JOIN ( SELECT *, ROW_NUMBER() OVER (PARTITION BY x_fk ORDER BY date DESC, y_pk DESC) AS rn FROM y ) AS ranked_y ON x.x_pk = ranked_y.x_fk AND ranked_y.rn = 1;
内容的提问来源于stack exchange,提问作者Ivo Treszka
相关产品推荐
相关产品推荐

