# MySQL, allte datensätze bis auf ältesten nach bedingung löschen!



## JesusFreak777 (25. Mai 2012)

Hallo,

ich möchte gerne alle doppelten Einträge löschen (mit drei WHERE bedingunen) bis auf den ältesten!


```
$delete_twice = "DELETE FROM tabelle WHERE Auftrags_NR = '5027150' AND Unterauftrag = '1' AND Status = '200' ORDER BY LASTCHANGE ASC LIMIT 1, 99";
```


meine Tabelle hat ne Auftragsnummer, einen Unterauftrag, einen Status, und einen LASTCHANGE!

LASTCHANGE ist ein Datum nachdem ich sortieren möchte! Mit dem Limit will ich alle Einträge außer dem 1. (mehr wie 99 doppelte Einträge wird es nie geben)!

Der gedanke funktioniert! Die Praxis irgendwie nicht :/

was mach ich Falsch?

Vielen Dank für die Tipps


----------



## Yaslaw (25. Mai 2012)

Du kannst eine der Lösungen aus dem folgenden Tutorial einbauen
MySQL Aktuelle Einträge pro Gruppe auslesen
Einfach mal umdrehen, dass der Älteste ausgewählt wird und diesen im DELETE per NOT IN ausschliessen.


----------



## JesusFreak777 (25. Mai 2012)

hm,
tut mir leid, irgendwie kann ich nichts damit danfangen :/ das sind ja alles select befehle!


----------



## Yaslaw (25. Mai 2012)

Ein DELETE ist nur ein wenig anderst als ein SELECT. Ich mache normalerweise zum testen immer zuerst ein SELECT. Wenn er mir die richtigen Daten anzeigt kann man ihn zu einem DELETE umschreiben.

Etwa so würde ich es testen

```
SELECT
	tabelle.*
FROM
	tabelle,
	(
		SELECT
			MIN(lastchange) AS mlc,
			auftrags_nr,
			unterauftrag,
			status
		FROM
			tabelle
		GROUP BY
			auftrags_nr,
			unterauftrag,
			status
	) AS oldest
WHERE
	NOT (
		tabelle.auftrags_nr   = oldest.auftrags_nr
		AND tabelle.unterauftrag  = oldest.unterauftrag
		AND tabelle.status		= oldest.status
	);
```
Dann ist das das DELETE-Statement

```
DELETE
	tabelle 
FROM
	tabelle,
	(
		SELECT
			MIN(lastchange) AS mlc,
			auftrags_nr,
			unterauftrag,
			status
		FROM
			tabelle
		GROUP BY
			auftrags_nr,
			unterauftrag,
			status
	) AS oldest
WHERE
	NOT (
		tabelle.auftrags_nr   = oldest.auftrags_nr
		AND tabelle.unterauftrag  = oldest.unterauftrag
		AND tabelle.status		= oldest.status
	);
```

Alles natürlich wie immer ungetestet und ohne Gewehr. Zu Risiken und Nebenwirkungen fragen sie Ihren Hausapotheker oder Hausarzt


----------



## JesusFreak777 (25. Mai 2012)

Hm,
jetzt gibt er mir irgendwie den falschen Auftrag zurück und vorallem genau den Ältesten! Genau den wo ich nicht löschen will!

irgendwie muss ich das WHERE doch aufteilen!
WHERE -> Auftrags_NR & Unterauftrag & Status
WHERE_NOT -> oldest

?


----------



## Godstyle (25. Mai 2012)

Kann man in dem Fall nicht theoretisch über DELTAE * WHERE 'spalte <  Max('spalte) FROM ...

hab keine Ahnung grade aber ist so ein gedanke das mit der MAX funktion zu lösen


----------



## JesusFreak777 (19. Juni 2012)

Hallo,

um nocheinmal auf das Thema zurück zu kommen,... ich hatte einen Fehler bei mir in der MySQL Verarbeitung (nach einer Neuinstallation geht es nun besser)

trotzdem passt die Ausgabe nicht ganz!

also ich hab 5 Felder! 
ID, LASTCHANGE, Auftrags_NR, Unterauftrag, Status

ID (spielt in diesen Szenario keine rolle)!
Auftrags_NR, Unterauftrag und Status sollten verknüpft behandelt werden! Das heißt das ich alle Aufträge auslesen möchte bei denen Auftrags_Nr, Unterauftrag und Status gleich sind!


IDAuftrags_NRUnterauftragStatusLASTCHANGE112311002012-06-19 07:49:12212311002012-06-19 07:51:10312311002012-06-19 07:52:05412511002012-06-19 08:01:55512512002012-06-19 08:02:12

Ich suche eine Funktion die feststellt das (im Beispiel) ID 1, 2 und 3 gleich sind und dann alle doppelten Werte löscht (außer dem ältesten -> ID 1).

Vielen Dank für jede Unterstützung!


----------

