如何为每个唯一uid获取最新unixdate对应的SQL查询结果
解决每个UID仅返回最新条目的SQL查询问题
我来帮你搞定这个问题!你之前用SELECT * FROM demo GROUP BY uid ORDER BY unixdate DESC没得到正确结果,核心原因是GROUP BY的设计是做聚合计算,直接选取非聚合列(比如cid)是不可靠的——数据库不会自动帮你关联到对应最大unixdate的那一行,甚至在严格模式下这种写法会直接报错。
下面给你两种通用且可靠的解决方案,适配绝大多数数据库:
方法1:子查询+关联(兼容所有数据库)
这个思路是先找出每个uid对应的最大unixdate,再通过关联原表拿到完整的行数据:
SELECT d.* FROM demo d INNER JOIN ( -- 先获取每个uid的最新unixdate SELECT uid, MAX(unixdate) AS max_unixdate FROM demo GROUP BY uid ) t ON d.uid = t.uid AND d.unixdate = t.max_unixdate;
原理说明:
- 子查询部分按
uid分组,用MAX(unixdate)拿到每个用户的最新时间戳 - 外层通过
uid和unixdate的双重匹配,精准定位到每个用户的最新条目
方法2:窗口函数(适用于MySQL 8.0+/PostgreSQL/SQL Server/Oracle等)
如果你的数据库支持窗口函数,这个方法更灵活,还能处理同个用户有多个相同最新时间条目的场景:
SELECT cid, uid, unixdate FROM ( SELECT *, -- 按uid分组,组内按unixdate降序排号,最新的行号为1 ROW_NUMBER() OVER (PARTITION BY uid ORDER BY unixdate DESC) AS rn FROM demo ) t WHERE rn = 1;
进阶调整:
- 如果想保留同个用户所有拥有最新
unixdate的条目(比如某用户有两行unixdate都是129),把ROW_NUMBER()换成RANK()或者DENSE_RANK()即可。
为什么你的原查询不对?
当你用GROUP BY uid时,数据库只会保证uid列是分组后的唯一值,但cid和unixdate如果不在聚合函数里,返回的是该分组内任意一行的值,完全不关联你想要的最新时间条目——这就是你得到错误结果的原因。
内容的提问来源于stack exchange,提问作者GiorgosK
相关产品推荐
相关产品推荐

