2017-05-18 2 views
0

I Tabelle wie diese in der Tabelle i,alle doppelten Zeilen in mySQL löschen 5.7.9

select id,channel,post from posts limit 10 
+------+------------+-------+ 
| id | channel | post | 
+------+------------+-------+ 
| 1433 | channel2 | 19353 | 
| 1434 | channel2 | 19353 | 
| 1435 | channel2 | 19354 | 
| 1436 | channel2 | 19354 | 
| 1437 | channel2 | 19356 | 
| 1438 | channel2 | 19357 | 
| 1439 | channel2 | 19358 | 
| 1440 | channel2 | 19359 | 
| 1441 | channel2 | 19360 | 
| 1634 | channel2 | 19360 | 
+------+------------+-------+ 

in dieser Tabelle id ein primary key ist, jetzt für einen Kanal ein Duplikat Post haben habe ich versuchen, ein hinzufügen unique key Tabelle und entfernen Sie alle doppelte Zeile mit dieser Abfrage

ALTER ignore TABLE `posts` ADD UNIQUE key `unique_index` (`channel`, `post`); 

aber in mysql 5.7.9 wir das nicht tun können!

so möchte ich wissen, wie ich doppelte Zeile löschen und einen eindeutigen Schlüssel für channel, post


Lösung

DELETE FROM posts 
WHERE ID Not in (SELECT* 
       FROM (SELECT MIN(ID) 
         FROM posts 
         GROUP BY channel, Post) B 
       ) 
+0

Ich nehme an, Sie möchten die Datensätze mit der minimalen ID zu halten? –

+0

@RaymondNijland: Wirklich das ist im Moment nicht wichtig, also nicht anders! – MrUnknow

Antwort

1

xQbert Doenst Arbeit Antwort, weil Sie nicht die gleiche Tabelle in einer Unterabfrage innerhalb eines Lösch verwenden können. Sie müssen also eine zusätzliche Tabelle verwenden, um dieses Problem zu lösen.

DELETE FROM 
posts 
WHERE 
posts.id NOT IN ( 
    SELECT 
    id 
    FROM ( 
    SELECT 
     MIN(id) AS id 
    FROM 
     posts 
    GROUP BY 
     posts.channel 
    , posts.post 
) 
    AS 
    posts_id  
) 
2

man denke an die Daten in Bezug auf die Sätze hinzuzufügen.

Sie möchten eine Untergruppe der Datensätze nach Kanalpost mit der Mindest-ID für einen Kanal und Posten (die zu speichernden Datensätze). Dann möchten Sie Beiträge löschen, bei denen keine ID aus allen Beiträgen in der Untergruppe enthalten ist (Aufzeichnungen zu behalten) Sie erstellt.

DELETE FROM posts 
WHERE ID Not in (SELECT* 
       FROM (SELECT MIN(ID) 
         FROM posts 
         GROUP BY channel, Post) B 
       ) 

So behalten Sie alle Kanäle/Beiträge mit ihrer min (ID). Sie könnten max (ID) verwenden oder wir könnten viel schicker werden; aber da Sie nicht eine Präferenz haben ...

SQL Fiddle

+0

Error Code: 1093. Sie können nicht Zieltabelle .... – MrUnknow

+0

aber ich tun dies: 'DELETE FROM Posts WHERE ID in (SELECT Minid von (wählen Sie min (id) als Minid von Posts GROUP BY Kanal, Post HAVING COUNT (*)> 1) x) 'und das ist Arbeit! – MrUnknow

+2

Nur verschachtelte eine Unterabfrage. – xQbert

Verwandte Themen