如何用原生SQL语法通过联表查询获取数据表最新记录?
获取每个Post对应的最新History记录(原生SQL联表实现)
方法1:子查询筛选最新记录
先找出每个post_id对应的最新记录标识(日期或ID),再通过联表匹配完整数据:
按最新检查日期匹配
SELECT p.*, h.* FROM post p JOIN histories h ON p.id = h.post_id JOIN ( SELECT post_id, MAX(inspection_date) AS latest_inspection_date FROM histories GROUP BY post_id ) latest_h ON h.post_id = latest_h.post_id AND h.inspection_date = latest_h.latest_inspection_date;
按最新记录ID匹配(避免同日多条记录的歧义)
SELECT p.*, h.* FROM post p JOIN histories h ON p.id = h.post_id JOIN ( SELECT post_id, MAX(id) AS latest_history_id FROM histories GROUP BY post_id ) latest_h ON h.id = latest_h.latest_history_id;
方法2:窗口函数实现(适用于MySQL 8+、PostgreSQL等支持窗口函数的数据库)
通过ROW_NUMBER()为每个post_id的记录按日期倒序排序,取排序为1的最新记录:
SELECT p.*, h.* FROM post p JOIN ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY post_id ORDER BY inspection_date DESC, id DESC ) AS row_rank FROM histories ) h ON p.id = h.post_id WHERE h.row_rank = 1;
补充说明
- 方法1兼容性更强,适配绝大多数数据库;
- 方法2逻辑更灵活,可自定义排序规则(比如优先按检查日期,日期相同时按记录ID倒序)。
内容的提问来源于stack exchange,提问作者SrdjanR
相关产品推荐
相关产品推荐

