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

如何在MariaDB分组查询中获取重复ext_id对应的最后一条id

如何在MariaDB分组查询中获取每组最后一条记录的id?

你只需要把原来查询中的s.id替换成MAX(s.id)就可以了——因为在你的数据里id是递增的,最大的id就对应分组里最后插入的那条记录。修改后的SQL语句如下:

SELECT s.ext_id, count(s.ext_id), MAX(s.id) AS last_id
FROM sale_point AS s
GROUP BY s.ext_id
HAVING count(s.ext_id) > 1;

为什么这样修改?

原来的查询中,当你在GROUP BY后直接选择非聚合列s.id时,MariaDB(和MySQL)会返回分组中任意一条记录的id(在你的场景里刚好是第一条)。这是因为SQL标准其实不允许在GROUP BY中选择未被聚合或未包含在分组条件里的列,但MariaDB默认允许这种行为,会返回存储顺序里的第一条记录。

而使用MAX(s.id)聚合函数后,会明确返回每个ext_id分组中最大的id值,也就是你需要的最后一条记录的id。

示例验证

用你提供的测试数据:

+--------+------------+
| id     | ext_id     |
+--------+------------+
| 376764 | 2065277658 |
| 390836 | 2065277658 |
+--------+------------+

执行修改后的查询,会得到如下结果:

+------------+-----------------+---------+
| ext_id     | count(s.ext_id) | last_id |
+------------+-----------------+---------+
| 2065277658 | 2               | 390836  |
+------------+-----------------+---------+

完全符合你想要的结果。

额外说明

如果你的id不是自增的,而是需要根据其他字段(比如创建时间create_time)来判断"最后一条",可以调整聚合逻辑:

SELECT s.ext_id, count(s.ext_id), s.id AS last_id
FROM sale_point AS s
INNER JOIN (
    SELECT ext_id, MAX(create_time) AS max_create_time
    FROM sale_point
    GROUP BY ext_id
    HAVING count(ext_id) > 1
) AS t ON s.ext_id = t.ext_id AND s.create_time = t.max_create_time
GROUP BY s.ext_id;

不过在你的场景里,用MAX(id)就足够解决问题了。

内容的提问来源于stack exchange,提问作者Вячеслав Чернышов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:47:09