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
相关产品推荐
相关产品推荐

