2013-07-12 12 views
5

IFinden neuesten ID Duplikate mit MySQL

SELECT email, COUNT(email) AS occurences 
FROM wineries 
GROUP BY email 
HAVING (COUNT(email) > 1); 

zu tun verwenden Duplikate auf ihre E-Mail-basierte zu finden.

Aber jetzt würde ich ihre ID benötigen, um zu definieren, welche genau zu entfernen.

Die zweite Einschränkung ist: Ich möchte nur die LAST INSERTED Duplikate.

Also, wenn es 2 Einträge mit [email protected] als E-Mail gibt und ihre IDs sind jeweils 40 und 12782 würde es nur den 12782 Eintrag löschen und den 40 Eintrag behalten.

Irgendwelche Ideen, wie ich das tun könnte? Ich habe SQL für ungefähr eine Stunde gemastert und kann nicht genau finden, wie man das tut.

Vielen Dank und einen schönen Tag!

+1

Ist die ID numerisch und in Ordnung? Ist Datensatz 231 immer nach Datensatz 32? –

+0

Gute Frage: Ja ist es. Danke für die Frage! – TomShreds

+0

Möglich (ahem) Duplikat von http://stackoverflow.com/questions/17612918/mysql-delete-older-duplicates – RandomSeed

Antwort

4

Nun, Sie beantworten Ihre Frage. Sie scheinen max(id) zu wollen:

SELECT email, COUNT(email) AS occurences, max(id) 
FROM wineries 
GROUP BY email 
HAVING (COUNT(email) > 1); 

Sie die anderen mit der Anweisung löschen. Löschen mit join hat eine schwierige Syntax, wo Sie den Tabellennamen zuerst aufzulisten und dann geben Sie die from Klausel mit dem Join:

delete wineries 
      from wineries join 
      (select email, max(id) as maxid 
      from wineries 
      group by email 
      having count(*) > 1 
      ) we 
      on we.email = wineries.email and 
       wineries.id < we.maxid; 

Oder schreibe dies als exists Klausel:

delete from wineries 
    where exists (select 1 
        from (select email, max(id) as maxid 
         from wineries 
         group by email 
         ) we 
        where we.email = wineries.email and wineries.id < we.maxid 
       ) 
+0

Beide Abfragen funktionieren bei mir leider nicht. – TomShreds

+0

Erste: 'Löschen von Weingütern w join (wählen Sie E-Mail, Max (Weingut) als Maxid von Weingüter Gruppe per E-Mail mit count (*)> 1) wir auf we.email = w.email und wir.winery_id TomShreds

+0

Zweiter ein: 'von Kellereien streichen vorhanden (wählen Sie 1 aus (wählen Sie E-Mail, max (winery_id) als maxid von Kellereien Gruppe per E-Mail) wir, wo we.email = wineries.email und we.winery_id TomShreds

0

Sie benötigen eine Unterabfrage, um MySQL aus einer Tabelle zu entfernen, aus der es gleichzeitig auswählt.

+0

Was passiert, wenn ein Eintrag keine Duplikate enthält? werden sie gelöscht, da die Abfrage sie nicht bekommt? Oh, ich schätze, die Gruppe wird immer noch denjenigen holen, mit dem man sich nicht gruppieren kann? – TomShreds

+0

Nein, da Sie die niedrigsten IDs auswählen und sie nicht löschen ('where id not in') - Einträge ohne Duplikate werden gespeichert. –

+0

Doing so: 'von Kellereien * wählen wo winery_id nicht in ( select * from ( select min (winery_id) von Kellereien Gruppe per E-Mail ) x)' was zu prüfen, tatsächlich gab mir bekommen gelöscht eine Liste der letzten statt der neuesten. Es ist normal? – TomShreds

1
select email, max(id), COUNT(email) AS occurences 
FROM wineries 
GROUP BY email 
HAVING (COUNT(email) > 1);