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

时间:2013-07-23 22:22:44

标签: php mysql sql database

我有一张桌子,用于为每个购买的产品存储一些系统选择的“序列号”......

问题是,上传的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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

某些版本的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)上的索引。