You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:07:45