Vinzenz Mai: MysQL - DELETE ab dem x-ten Eintrag pro ID

Beitrag lesen

Hallo André

Wie gehe ich nun vor, wenn ich alle über den 10ten Eintrag (sortiert nach Datum) hinausgehenden Einträge pro ID löschen möchte?

D.h. als Resultat soll gewährleistet sein, dass pro ID stets maximal 10 Einträge vorhanden sind (sortiert nach Datum).

Das ganze geht IMHO nur mit einem Subselect.

Nein. Da liegst Du falsch.

Mit dem Subselect hole ich das Datum des 11. Eintrages mit der id=10, absteigent sortiert. Dann werden die Einträge gelöscht, die die id=10 besitzen und bei denen das Datum kleiner oder gleich ist, als das vom 11. Eintrag. Der 11. Eintrag sollte also auch mit raus fliegen.

!!! UNGETESTET !!!

und ungeeignet.

DELETE
FROM
  tabelle
WHERE
  id = 10
AND
  datum <=
     (
       SELECT datum FROM tabelle WHERE id = 10 ORDER BY datum DESC LIMIT 10, 1
     );

  
Dummerweise haben die nächsten 5 Datensätze ebenfalls das gleiche Datum wie der 11. Eintrag. Es bleiben nur noch 5 Datensätze übrig, keine 10 wie gefordert.  
  
Wenn schon Subselect, dann finde eine Spalte, die die 10 Datensätze, die übrig bleiben sollen genau identifiziert und verwende `WHERE ... NOT IN (SELECT ...)`{:.language-sql}.  
  
Eine Möglichkeit ohne Subselect wäre der Einsatz von Benutzervariablen. Siehe mein [Archivposting](/archiv/2006/9/t136068/#m883458) in einem anderen Zusammenhang. Lösche die Datensätze mit Variablenwerten > 10. (Ebenfalls ungetestet!)  
  
  
Freundliche Grüße  
  
Vinzenz