MySQL - Doppelte Einträge, bis auf Neuesten anzeigen

em-dee

LTE-geschädigt
ID: 6633
L
25 April 2006
506
20
Hallo zusammen,

vielleicht hat jemand eine Idee wie ich das gelöst bekommen könnte:

Habe ein Tabelle aus der ich doppelte einträge bis auf den neuesten löschen möchte.

id - serial - datum - text
1 – 2323 - datetime1 - asdasdasd
2 - 2323 - datetime4 - sgfvdbref
3 - 4444 - datetime3 - fjdnhrjnor
4 - 2323 - datetime2 - dfgghzjer
5 - 1234 - datetime5 -iorpiet095k
6 - 4444 - datetime6 - sefdthdg45

Die Tabelle ist nicht immer nach IDs sortiert.

Ergebnis wären IDs: 1,3,4

Ich suche jetzt alle Einträge von Serial (Geräte S/N) die doppelt vorkommen, jedoch nicht den mit dem aktuellsten Datum.

Ziel ist nachher dass ich die Einträge aus der DB löschen möchte, bis auf den schon erwähnten neuenesten Eintrag. Jedoch wäre zum "schrauben" eine Ausgabe ausreichend.

Hat jemand von euch eine Idee oder einen Ansatz, ob das in einer Abfrage zu lösen ist? Evtl. mit Subquerys (die ich irgendwie nicht so recht in den Kopf bekomme).

Die DB kann ich nicht Uniqe auf serial machen, da ich die doppelten Einträge erstellen und weiterverarbeiten muss, bis ich sie löschen kann. Die Einträge werden durch eine .EXE erzeugt auf die ich keinen Einfluss nehmen kann.

...Mark
 
Interessante Aufgabe, garnet mal so einfach ;)

Bin aber nach vielen Seiten Manual und einigen Tests zu folgendem Ergebnis gekommen:
Code:
SELECT `id`, `serial`, `datum`, `text` /* bzw DELETE */
FROM `test` t1
WHERE `datum` NOT IN
    (SELECT MAX(`datum`)
    FROM `test` t2
    WHERE t1.`serial` = t2.`serial`)
Zur Erklärung:
Das Subquery sucht das Maximum in der Datumsspalte für jeden vorhandenen Serial. Sprich es listet die Reihen auf, die du behalten möchtest.
Danach zeigt das äußere Query nur noch die Datensätze an, die nicht in der Liste enthalten sind (bzw. löscht sie).

Ich muss zugeben, dass ich das Ganze selbst noch nicht komplett durchschaut habe, aber mit meinen Testdaten hats funktioniert :)
(Die Where-Klausel im Subquery verbindet die beiden Querys wohl irgendwie, so dass nicht auch andere Einträge mit gleichem Datumswert selektiert werden...)

Kannst es ja mal auf deine Daten anwenden (die wohl umfangreicher als meine 7 Testsätze sind) und schauen, obs da auch klappt.

Falls nicht... muss ich mir was andres überlegen ;)

Gruß
 
Interessante Aufgabe, garnet mal so einfach ;)
.....
Falls nicht... muss ich mir was andres überlegen ;)

OH MARK!
So einfach und ich komm net drauf!
Deine Abfrage ist einfach nur genial!!! Leider klappt das mit dem DELETE nicht, da man bei Subquerys net löschen kann.

Ich habs mit Hilfde eines Temporary-Table gemacht:
Code:
CREATE TEMPORARY TABLE tmpid (Tid int);

INSERT INTO tmpid
SELECT PCBIndex
FROM `pcbtable` pcb1
WHERE DTTestStart NOT IN
 (SELECT MAX(DTTestStart)
  FROM `pcbtable`pcb2
  WHERE pcb1.Serial = pcb2.Serial);

DELETE FROM pcbtable
WHERE PCBIndex IN (SELECT Tid FROM tmpid WHERE 1);
Herzlichen dank dafür!! So muss ich nicht alles durchsuchen und von Hand löschen... Vor allem kann man das dann Automatisieren!

Freu mich echt dass dass du mich darauf gestossen hast. *blindbin*

...Mark