如何在MySQL 5.7.22中查询5条最新的唯一nid记录?
MySQL 5.7.22:获取按nid唯一的最新5条记录
我来帮你解决这个问题,在MySQL 5.7.22中要获取按nid唯一的最新5条记录,单纯用DISTINCT确实达不到预期效果,我们得换个思路来实现。
先明确你的场景:activity表存在重复nid的记录,需要为每个nid保留最新的那一条,再从中选取最靠前的5条完整记录(包含uaid、nid、created)。
你的示例表数据
uaid nid created 9222 29722 2018-05-17 03:19:33 9221 31412 2018-05-17 03:19:19 9220 31160 2018-05-16 23:47:34 9219 31160 2018-05-16 23:47:30 9218 31020 2018-05-16 22:35:59 9217 31020 2018-05-16 22:35:54 9216 28942 2018-05-16 22:35:20
你期望的结果
uaid nid created 9222 29722 2018-05-17 03:19:33 9221 31412 2018-05-17 03:19:19 9220 31160 2018-05-16 23:47:34 9218 31020 2018-05-16 22:35:59 9216 28942 2018-05-16 22:35:20
为什么你的尝试无效?
你用的SELECT DISTINCT nid FROM activity ORDER BY created DESC LIMIT 5有两个核心问题:
- 仅返回
nid字段,不符合你需要完整记录的需求; DISTINCT是对结果集去重,但ORDER BY created无法保证每个nid对应的是其最新记录的创建时间,排序逻辑完全不符合预期。
正确的解决方案(兼容MySQL 5.7)
由于MySQL 5.7不支持窗口函数(比如ROW_NUMBER()),我们用两种传统可靠的方法实现:
方法1:子查询+关联查询(基于created时间)
先通过子查询找到每个nid对应的最新created时间,再关联原表获取完整记录,最后排序取前5:
SELECT a.uaid, a.nid, a.created FROM activity a INNER JOIN ( -- 筛选每个nid的最新创建时间 SELECT nid, MAX(created) AS max_created FROM activity GROUP BY nid ) b ON a.nid = b.nid AND a.created = b.max_created ORDER BY a.created DESC LIMIT 5;
方法2:相关子查询(基于自增uaid,更可靠)
如果uaid是自增主键(从示例数据看是递增的),那么最大的uaid就对应每个nid的最新记录,这个方法可以避免created时间重复的边界情况:
SELECT a.uaid, a.nid, a.created FROM activity a WHERE a.uaid = ( -- 找到当前nid对应的最大uaid(即最新记录) SELECT MAX(uaid) FROM activity WHERE nid = a.nid ) ORDER BY a.created DESC LIMIT 5;
这两种方法都能精准返回你需要的、按nid唯一的最新5条完整记录。
内容的提问来源于stack exchange,提问作者Linux Pro
相关产品推荐
相关产品推荐

