Zum Inhalt springen

[mysql] Doppelte Datensätze aus Tabelle löschen


sockä

Empfohlene Beiträge

Hi,

habe schon ein wenig gesucht hier im Forum, aber die gefunden Ergebnisse brachten leider keine Lösung. Also: ich möchte aus einer Tabelle doppelte Datensätze löschen. Die Datensätze sind bis auf eine Spalte gleich, und diese Spalte ist eine Datumsangabe. Ich möchte jetzt alle Datensätze, die in den anderen Spalten (z.b. Name, Vorname, Adresse) die gleichen Werte haben, löschen, und nur den einen Datensatz übrig behalten, dessen Datum das Aktuellste ist.

Beispiel:

1 Müller Hugo Musterstadt 2005-01-01

2 Müller Hugo Musterstadt 2005-01-02

3 Müller Hugo Musterstadt 2005-01-03

4 Müller Hugo Musterstadt 2005-01-04

5 Müller Hugo Musterstadt 2005-01-05

Datensatz 5 soll übrig bleibe, Datensatz 1-4 sollen gelöscht werden.

Habe es mit SelfJoins versucht, aber da stürzte mysql ab. Dann habe ich es mit Like-Vergleichen versucht, ging auch in die Hose. Bei count(*) krieg ich irgendwie nicht das gewünschte Ergebnis.

Paar Randdaten: Es ist mysql 4.x System, von daher sind Subquerys nicht möglich. Es handelt sich um so ca. 4000 Datensätze in ca. 15 Spalten, von daher sollte die Such-und-Lösch-Operation halbwegs schnell abgehen.

Jemand eine Idee?

Hatte dieses hier (beim googlen gefunden) ausprobiert:

SELECT * FROM Adresse

INNER JOIN (SELECT Name, Vorname

*********** FROM Adressen

*********** GROUP BY Name, Vorname

*********** HAVING COUNT(*) > 1) AS AdresseCnt

ON Adresse.Name = AdresseCnt.Name AND Adresse.Vorname = AdresseCnt.Vorname

aber da kommt n Fehler von mysql "Check your syntac at SELECT Name, Vorname " ?!?!?!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem liegt, dass ich solche exakten Werte wie "Hugo" oder "Musterstadt" nicht eingeben kann (das war nur ein Beispiel wie es in der DB aussieht). Ich bräuchte eher sowas wie "wenn Name, Vorname, Adresse eines Datensatzes gleich dem eines anderen sind, dann nimm diesen raus ABER behalte den Datensatz mit dem aktuellsten Datum".

Ich kann also keine exakten Werte zum Deleten eingeben... muss dynamisch sein. Wenn jemand eine Lösung in PHP hat wäre ich auch glücklich... denn damit probiere ich es gerade aus... meine Idee soweit:

1. alle Datensätze holen, in Array speichern

2. Array durchwandern und jeden Wert mit dem seines Nachfolgers vergleichen und gucken, ob sie gleich sind. Wenn sie gleich sind: ID merken in einem neuen Array.

3. Zum Schluss das Array mit den IDs durchwandern und bei jedem Element sagen "Delete From XY where ID like id[$i]"... oder so.

... nur leider funktioniert Schritt 2 nicht... denn es sind ja nicht immer nur die Nachfolger eventuell gleich sondern vielleicht auch ein Datensatz 100 Zeilen tiefer. Und mir fehlt die zündende PHP-Idee wie ich gucken kann oder die Werte eines Datensatz IRGENDWO in meinem Datensatz-Array nochmal vorkommen.... *hmppfff*

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo sockä,

bevor Du Dein erstes Array befuellst, koenntest Du ja Dein SELECT sortiert zurueckgeben lassen.

SELECT * FROM wasweissich ORDER BY nachname, vorname;

Dann stehen schon mal die richtigen Datensaetze alle zusammen.

Ueber den Rest mach ich mir nach der zweiten Tasse Kaffee gedanken.

Gruessle

bio*

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo,

eine Möglichkeit wäre noch, eine 2 Tabelle zu erstellen mit den gleichen Feldern, und sofort die Name und Vorname unique zu machen. Dann können zukünftig keine doppelten Einträge mehr eingefügt werden.

Aus der alten Tabelle machst du eine Abfrage wie folgt:


insert into tmp (name, vorname, datum) select name, vorname, max(datum) from personen group by name;

Da werden automatisch alle Datensätze mit dem höchsten Datum ausgewählt und automatisch in die neue Tabelle eingetragen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...