我有一个表,用来为购买的每种产品存储一些系统选择的"序列号"。。。
问题是,我认为上传的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