2016-07-22 9 views
0

Ich habe für ein oder zwei Tage versucht, ein paar doppelte Datenbankzeilen, die in meinem System nach einem kleinen Fehler an meinem Ende erschien, zu entfernen, habe ich versucht die meisten (wenn nicht alle) Methoden, die ich bisher auf Stackoverflow finden konnte. Ich hatte mehrere dieser Methoden fehlerfrei vorher auf dem gleichen Mariadb und MySQL, als ich versucht habe, jetzt zu löschen.Löschen doppelte Zeilen (gesucht und versucht, was hier schon ist)

Dies ist meine Tabellenstruktur.

ID | Datum | Erfahrung | Characterid

ID ist die eindeutige Kennung (aka Auto Inkrementierung), jede Zeichen-ID sollte nur EINEN Eintrag pro Datum haben, und das ist, was dupliziert wurde. Einige Characterids haben 5-7 Einträge pro Datum, identische Daten (ich habe überprüft).

Ich habe die folgenden Abfragen versucht, sie zu entfernen, die in der Vergangenheit für ähnliche Probleme gearbeitet haben, die ich gehabt habe.

DELETE n1 FROM experiencehistory n1, experiencehistory n2 WHERE n1.id > n2.id AND n1.date = n2.date AND n1.characterid = n2.characterid 

aswell als

DELETE experiencehistory FROM experiencehistory 

LEFT OUTER JOIN ( SELECT MIN (id) als RowId, characterid, Datum FROM experiencehistory GROUP BY characterid, Datum ) als KeepRows ON experiencehistory.id = KeepRows.RowId WHERE KeepRows.RowId ist NULL

Beide produzieren keine Ergebnisse in der Konsole und durch PHPMyadmin erhalte ich diesen Fehler;

Irgendwelche Vorschläge, was ich tun könnte, um dies zu lösen oder wenn ich etwas falsch mit diesen Methoden habe ich in erster Linie versucht?

Serverversion: 10.1.13-MariaDB - mariadb.org Binärdistribution

Dankbar für jede Einsicht!

Antwort

1

Sie können auf diese Weise versuchen, (löschen Sie alle ID = für min (id) Gruppe von characterid, Datum

DELETE FROM experiencehistory 
where (id, characterid, date) not in 
     (select x_id, characterid , x_date from (select min(x.id) as x_id 
        , x.characterid as x_characterid 
       , x.date as x_date 
      from experiencehistory as x group by x.characterid, x.date) t); 
+0

Ich mag diese Idee recht haben, aber irgendwo entlang der Strecke bekomme ich einen Fehler spuckte mich an .. Erprobtes Entfernen/Hinzufügen von Klammern, aber konnte diesen Fehler nicht richtig herausfinden, vielleicht haben Sie etwas Ähnliches gefunden? >>> # 1064 - Sie haben einen Fehler in Ihrer SQL-Syntax, überprüfen Sie das Handbuch, das Ihrem MariaDB entspricht Server-Version für die richtige Syntax zu verwenden in der Nähe von 'aus Experience History-Gruppe von Characterid, Datum)' in Zeile 2 >> Auch Serververison im ersten Post hinzugefügt. – Hultin

+0

Es schien gut zu funktionieren, wenn der aktualisierte Post das erste Mal ausgeführt wurde, außer dass das Timing fehlte (ich hatte nicht berücksichtigt, dass die fragliche Tabelle mehr als eine Million Zeilen enthielt). Aber im zweiten Durchlauf (nachdem ich die maximale Laufzeit auf 24 Stunden erhöht hatte) bekomme ich diese # 1093 - Tabelle 'experiencehistory' wird zweimal angegeben, sowohl als Ziel für 'DELETE' als auch als separate Quelle für Daten At Zuerst dachte ich, hey, vielleicht liegt es daran, dass alle Duplikate gelöscht wurden, aber das war nicht der Fall. Wirklich nervig! – Hultin

+0

Ich habe Update die Antwort mit Alias ​​.. – scaisEdge