2013-07-23 55 views
0

我有我用它來存儲一些系統選擇「序列號」爲每個已購買產品的表...的MySQL - 查詢列的副本,並同時返回正本和副本行

的問題是,我上傳了一份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 

所以你可以看到,我需要能夠同時看到原始行和重複行和它的所有數據的列...這是這樣我就可以比較它們並確定哪些數據現在不一致。

回答

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)的指數。

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 
+0

我不知道這個查詢是否爲我做了什麼......它只是掛起來。沒有大量的數據,但我會想象有太多的事情要處理? 「 – dcolumbus

+0

」錯誤代碼:1317.查詢執行中斷。「 – dcolumbus

+0

@dcolumbus我建議你在serial_number列上添加一個索引,它應該執行得更快,或者你可以嘗試gordon linoff解決方案,在mysql中連接速度通常更快 – fthiella