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

MariaDB如何查询links表中重复product_id对应的所有记录

问题根因

你的原始SQL缺失GROUP BY product_id子句,在MariaDB默认配置下,无分组字段时会触发全表聚合,因此返回的是全表总行数的统计结果,且这种聚合写法本身也无法返回重复product_id对应的完整行记录。

可直接使用的正确写法

写法1:分组子查询关联(全版本兼容)

这是兼容性最好的方案,所有MariaDB版本都支持:

SELECT l.*
FROM links l
JOIN (
    SELECT product_id
    FROM links
    GROUP BY product_id
    HAVING COUNT(*) > 1
) repeat_pid ON l.product_id = repeat_pid.product_id;

逻辑很简单:子查询先筛选出所有出现次数超过1次的product_id,再通过内连接关联原表,就能取出这些重复product_id对应的所有完整行,执行结果和你期望的完全一致。

写法2:窗口函数写法(适用于MariaDB 10.2+)

如果你的MariaDB版本是10.2及以上,支持窗口函数的话可以用更简洁的写法,不需要做表关联:

SELECT id, product_id, last_change
FROM (
    SELECT *, COUNT(*) OVER (PARTITION BY product_id) AS pid_count
    FROM links
) t
WHERE pid_count > 1;

逻辑是通过窗口函数按product_id分区,给每一行附上对应product_id的总出现次数,之后直接过滤出计数大于1的行即可。

补充:原始聚合语句的修正

如果你只是需要查询哪些product_id存在重复、以及对应的重复次数,不需要完整行的话,只需要给你原来的语句补上GROUP BY product_id即可:

SELECT product_id, COUNT(*) 
FROM links 
GROUP BY product_id
HAVING COUNT(*) > 1;

内容的提问来源于stack exchange,提问作者xtlc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:06:23