sockä Geschrieben 28. Februar 2005 Teilen Geschrieben 28. Februar 2005 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 " ?!?!?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ITSE Geschrieben 1. März 2005 Teilen Geschrieben 1. März 2005 mit einem einfachen DELETE sollte es doch gehen: DELETE FROM Tabelle WHERE Name='Mueller' AND VORNAME='Hugo' AND STADT='Musterstadt' AND DATUM<>aktuelles Datum oder wo ist da das Problem? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sockä Geschrieben 1. März 2005 Autor Teilen Geschrieben 1. März 2005 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* Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bionaut Geschrieben 2. März 2005 Teilen Geschrieben 2. März 2005 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* Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kills Geschrieben 2. März 2005 Teilen Geschrieben 2. März 2005 hmm DELETE FROM tabelle WHERE id in ( SELECT id FROM tabelle GROUP BY name, vorname,stadt) ungestestet! Gruß, Markus Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 2. März 2005 Teilen Geschrieben 2. März 2005 DELETE FROM tabelle WHERE id in ( SELECT id FROM tabelle GROUP BY name, vorname,stadt) Ich würde sagen danach sind nur noch die doppelten da. Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sockä Geschrieben 2. März 2005 Autor Teilen Geschrieben 2. März 2005 ... abgesehen davon gehen Unterabfragen in mysql 4.x nicht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 2. März 2005 Teilen Geschrieben 2. März 2005 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.