MySQL 5.6中从两表每组获取最后一条注册记录的查询求助
解决方案
针对MySQL 5.6版本,由于不支持窗口函数,我们可以通过子查询筛选每个(val1, val2)组合的最新日期,再关联原表获取对应字段的方式实现需求:
查询语句
SELECT combined.val1, combined.val2, t1.num1, t2.num2, combined.latest_created_date AS created_date FROM ( -- 获取每个(val1, val2)组合的最新created_date SELECT val1, val2, MAX(created_date) AS latest_created_date FROM ( -- 合并两个表的日期记录,覆盖所有可能的日期条目 SELECT val1, val2, created_date FROM table1 UNION ALL SELECT val1, val2, created_date FROM table2 ) AS all_dates GROUP BY val1, val2 ) AS combined -- 关联table1获取对应num1 LEFT JOIN table1 t1 ON combined.val1 = t1.val1 AND combined.val2 = t1.val2 AND combined.latest_created_date = t1.created_date -- 关联table2获取对应num2 LEFT JOIN table2 t2 ON combined.val1 = t2.val1 AND combined.val2 = t2.val2 AND combined.latest_created_date = t2.created_date;
逻辑说明
- 合并日期记录:用
UNION ALL合并table1和table2的val1、val2、created_date字段,确保不遗漏任何日期数据。 - 筛选最新日期:通过
GROUP BY val1, val2结合MAX(created_date),得到每个唯一组合的最新日期。 - 关联原表取数:将筛选出的最新日期结果分别与
table1、table2关联,匹配val1、val2和最新日期,获取对应的num1和num2。
预期结果
执行该查询后将返回:
| val1 | val2 | num1 | num2 | created_date |
|---|---|---|---|---|
| X | A | 33 | 333 | 2022-11-03 |
| X | B | 66 | 666 | 2022-11-06 |
| X | C | 88 | 888 | 2022-11-08 |
| X | D | 99 | 999 | 2022-11-09 |
| Y | A | 111 | 1111 | 2022-11-11 |
内容的提问来源于stack exchange,提问作者JohnP
相关产品推荐
相关产品推荐

