如何在MySQL中选取time1列值相同且最新的所有行
嘿,这个需求我碰到过好多次了,给你分享几种在MySQL里实现的方法,你可以根据自己的MySQL版本和数据规模来选:
方法1:窗口函数(MySQL 8.0+首选)
如果你用的是MySQL 8.0及以上版本,强烈推荐用窗口函数,代码简洁还好理解,效率也高。核心思路是给每个time1分组里的行按时间排序,然后挑出排名第一的行。
示例代码:
SELECT * FROM ( SELECT *, -- 按time1分组,每组内按时间倒序编号,最新的行编号为1 ROW_NUMBER() OVER (PARTITION BY time1 ORDER BY your_time_column DESC) AS row_rank FROM your_table_name ) ranked_data WHERE row_rank = 1;
补充说明:
- 把
your_table_name换成你的实际表名,your_time_column换成记录时间的列(比如update_time或者create_time) - 如果同一个
time1下有多个行是同一最新时间,想把这些行都保留的话,把ROW_NUMBER()换成RANK()或者DENSE_RANK()就行——这俩函数会给相同时间的行分配相同的排名,不会只留一行
方法2:子查询关联(兼容所有MySQL版本)
要是你的MySQL版本低于8.0,没法用窗口函数,那就用子查询先找出每个time1对应的最新时间,再关联原表拿完整数据。
示例代码:
SELECT main_table.* FROM your_table_name main_table INNER JOIN ( -- 先找出每个time1对应的最新时间 SELECT time1, MAX(your_time_column) AS latest_time FROM your_table_name GROUP BY time1 ) latest_time_map ON main_table.time1 = latest_time_map.time1 AND main_table.your_time_column = latest_time_map.latest_time;
这个方法的逻辑很直观:先通过分组聚合拿到每个time1的最新时间,再用这个结果去匹配原表中对应的数据行,就能得到每个time1组里的最新记录。
方法3:EXISTS子句(小数据量场景适用)
还有一种写法是用EXISTS来判断当前行是不是该time1组里的最新行,适合数据量不大的情况:
SELECT * FROM your_table_name t1 WHERE NOT EXISTS ( -- 检查是否存在同一time1且时间更晚的行 SELECT 1 FROM your_table_name t2 WHERE t2.time1 = t1.time1 AND t2.your_time_column > t1.your_time_column );
简单说就是:如果某一行在它的time1分组里找不到比它时间更新的行,那它就是我们要找的最新行。
记得把代码里的占位符换成你实际的表名和列名哦!
内容的提问来源于stack exchange,提问作者sandeep pawar
相关产品推荐
相关产品推荐

