MySQL-查询列的重复项,并返回原始行和重复行


MySQL - query for duplicates of a column and return both original and duplicate rows

我有一个表,用来为购买的每种产品存储一些系统选择的"序列号"。。。

问题是,我认为上传的CSV包含一些重复的"序列号",这意味着当应用程序试图修改一行时,它可能没有修改正确的行。

我需要能够查询数据库并获得serial_number列的两倍的所有行。它应该看起来像这样:

ID, serial_number, meta1, meta2, meta3
3, 123456, 0, 2, 4
55, 123456, 0, 0, 0
6, 345678, 0, 1, 2
99, 345678, 0, 1, 2

正如你所看到的,我需要能够看到原始行和重复行,以及它的所有数据列。。。这样我就可以比较它们,并确定哪些数据现在不一致。

MySQL的某些版本使用子查询实现in的效率非常低。一个安全的替代方案是加入:

SELECT t.*
FROM t join
     (select serial_number, count(*) as cnt
      from t
      group by serial_number
     ) tsum
     on tsum.serial_number = t.serial_number and cnt > 1
order by t.serial_number;

另一种选择是使用exists子句:

select t.*
from t
where exists (select * from t t2 where t2.serial_number = t.serial_number and t2.id <> t.id)
order by t.serial_number;

这两个查询(以及@fthiella提出的查询)都是标准SQL。两者都将受益于(serial_number, id)上的索引。

SELECT *
FROM
  yourtable
WHERE
  serial_number IN (SELECT serial_number
                    FROM yourtable
                    GROUP BY serial_number
                    HAVING COUNT(*)>1)
ORDER BY
  serial_number, id