如何基于给定元组查询MySQL表中对应值的最新日期记录?
解决方案
假设你的表名为your_table,以下是两种能得到目标结果的查询方法:
方法1:关联子查询匹配最新记录
先通过子查询获取指定value对应的最大date,再关联原表拿到完整的最新记录:
SELECT t.id, t.value, t.date FROM your_table t INNER JOIN ( SELECT value, MAX(date) AS max_date FROM your_table WHERE value IN ('foo', 'bar') GROUP BY value ) t_max ON t.value = t_max.value AND t.date = t_max.max_date WHERE t.value IN ('foo', 'bar');
方法2:窗口函数(MySQL 8.0及以上版本可用)
利用ROW_NUMBER()窗口函数,按value分组后对date降序排序,取每组排名第一的记录:
SELECT id, value, date FROM ( SELECT id, value, date, ROW_NUMBER() OVER (PARTITION BY value ORDER BY date DESC) AS rn FROM your_table WHERE value IN ('foo', 'bar') ) t WHERE rn = 1;
为什么单纯用MAX(date)+GROUP BY不行?
当执行SELECT id, value, MAX(date) FROM your_table GROUP BY value时,MySQL在仅按value分组的情况下,非聚合列id会返回分组内任意一条记录的id,无法保证它和MAX(date)属于同一条数据,因此得不到你想要的结果。
你的表数据(格式化后)
| id | value | date |
|---|---|---|
| 1 | foo | 2024-05-29 03:38:12 |
| 2 | foo | 2024-05-27 12:37:06 |
| 3 | xxx | 2024-05-29 08:17:24 |
| 4 | foo | 2024-05-27 13:45:03 |
| 5 | bar | 2024-05-28 12:56:04 |
| 6 | bar | 2024-05-29 08:36:14 |
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

