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

JesusFreak777

Erfahrenes Mitglied
Hallo,

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

PHP:
$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
 
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
SQL:
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
SQL:
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
 
Zuletzt bearbeitet von einem Moderator:
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

?
 
Zuletzt bearbeitet:
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
 
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_NRUnterauftragStatusLASTCHANGE
112311002012-06-19 07:49:12
212311002012-06-19 07:51:10
312311002012-06-19 07:52:05
412511002012-06-19 08:01:55
512512002012-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!
 
Zurück