2013-02-28 56 views
0

我一直在抨擊這個問題,並且在堆棧交換中查看了一些類似的情況,我讀得越多,我就越困惑! 我有了如下表:MySQL刪除同一張表中的重複項

id | zipcode | provider | channel 
--------------------------------- 
1 | 91773 | 342  | 0 
2 | 91773 | 2261  | 177 
3 | 91773 | 5590  | 0 
4 | 91773 | 5590  | 0 
5 | 91773 | 5590  | 135 
6 | 91773 | 5590  | 0 
7 | 91773 | 6010  | 0 
8 | 91773 | 6010  | 0 

我想只保留一個記錄,如果該頻道有什麼,但一個0,那麼我們能繼續保持。所以它應該返回這個:

id | zipcode | provider | channel 
--------------------------------- 
1 | 91773 | 342  | 0 
2 | 91773 | 2261  | 177 
5 | 91773 | 5590  | 135 
8 | 91773 | 6010  | 0 

我試了不少的查詢,但都沒有工作。提前致謝。

編輯: 我已經嘗試了一些的例子給出,但似乎沒有給回正確的信息,一個更好的例子是使用這些,你可以看到爲什麼: INSERT INTO獨角獸值

(1, 91773, 342, 0), 
(2, 91773, 2261, 177), 
(3, 91773, 5590, 0), 
(4, 91773, 5590, 0), 
(5, 91773, 5590, 135), 
(6, 91773, 5590, 0), 
(7, 91773, 6010, 0), 
(8, 91773, 6010, 0), 
(9, 91776, 5590, 135), 
(10, 91776, 5590, 0), 
(11, 91776, 6010, 0), 
(12, 91776, 6010, 0); 
+0

可能重複的[如何刪除mysql表上的重複項?](http://stackoverflow.com/questions/2630440/how-to-delete-duplicates-on-mysql-table) – 2013-02-28 20:24:35

+0

我想你需要組通過郵政編碼和提供商,不只是通過郵編,我更新了我的答案,請看看它是否可以 – fthiella 2013-03-01 16:51:44

回答

0

我想你可以使用的東西像這樣:

delete from unicorns 
where id not in (
    SELECT * FROM (
    SELECT MAX(id) 
    FROM unicorns 
    WHERE (provider, zipcode, channel) IN (
     SELECT provider, zipcode, max(channel) mx_channel 
     FROM unicorns 
     GROUP BY provider, zipcode 
    ) 
    GROUP BY provider, zipcode) s) 

請參閱小提琴here

+2

我唯一的猶豫就是你'錯誤地使用'GROUP BY' – Kermit 2013-03-01 15:31:14

+0

@AarolamaBluenk爲什麼不正確?我爲每個提供商返回maxumum頻道,然後爲每個提供商提供具有最大值的最大ID ......它對我來說是正確的 – fthiella 2013-03-01 16:10:59

+0

將您的SQL模式設置爲「ONLY_FULL_GROUP_BY」,您將看到原因。爲了方便,MySQL擴展了它的功能。如果你搬到不同的平臺,你會哭。我當然做到了。 – Kermit 2013-03-01 16:15:01

3

像這樣的東西應該工作...

DELETE unicorns 
FROM unicorns 
WHERE id NOT IN (SELECT id 
        FROM (SELECT unicorns.provider, 
           Max(id) AS id 
          FROM unicorns 
           LEFT JOIN (SELECT provider, 
                Max(channel) AS channel 
              FROM unicorns 
              GROUP BY provider) p 
             ON p.provider = unicorns.provider 
              AND p.channel = unicorns.channel 
          WHERE p.provider IS NOT NULL 
          GROUP BY unicorns.provider) p2) 

See the demo

+1

非常感謝,我甚至沒有想到這一點。我會堅持圖形。 :)再次感謝Aarolama! – Anthony 2013-02-28 20:51:02

+0

@aariloama我測試了這個,它似乎不起作用,它刪除了至少應保留一個郵政編碼的郵政編碼;它刪除了提供者的確切數量。 – Anthony 2013-02-28 21:02:05

+0

@Anthony請嘗試其他解決方案。 – Kermit 2013-02-28 21:09:30

2

您可以使用自連接執行此操作。如果你只是在做刪除:

DELETE a 
FROM foo a 
    JOIN foo b on (a.zipcode = b.zipcode AND a.provider = b.provider) 
WHERE 
    a.channel < b.channel; 

如果你想看到的數據在刪除之前(什麼會留下):

SELECT * 
FROM foo 
WHERE ID NOT IN (
SELECT a.id 
FROM foo a 
    JOIN foo b on (a.zipcode = b.zipcode AND a.provider = b.provider) 
WHERE 
    a.channel < b.channel); 

SQL Fiddle demo