/MySQL5: Problem mit Abfragelogik
Roger
- datenbank
0 Ilja0 Vinzenz Mai0 Ilja
1 Vinzenz Mai
hallo!
Ich habe ein kleines logisches Problem, weiß nicht, wie ich drauf kommen soll.
Ich habe in einer DB mehrere Datensätze (vereinfachte Spaltennamen: id (autoincrementell), name, timestamp).
Von den Datensätzen sind ca 30 vorhanden (variiert). Ich möchte aber, das nur die 10 neuesten in der DB stehen.
Also brauche ich eine Routine, die mir die ältesten 20 ermittelt. Dabei tritt folgendes Problem auf:
Ich muss den Timestamp des 10. Eintrages bestimmen, um alle älteren löschen zu können.
Schaff ich das alles in eine Abfrage zu stopfen? Im Zeitalter von MySQL5 und Sub-Selects müsste das doch gehen. Oder wäre das zu unperformant? Gibt es evtl. eine elegantere Methode (vllt. Stored Procedures)?
DELTE FROM table
WHERE timestamp
< timestamp\_vom\_10ten\_eintrag
; :)
gruß.
roger.
yo,
DELETE FROM tabelle t1
WHERE t1.id NOT IN (SELECT t2.id
FROM tabelle t2
ORDER BY t2.timestamp
LIMIT 0, 10
)
;
Ilja
Hallo Ilja,
DELETE FROM tabelle t1
WHERE t1.id NOT IN (SELECT t2.id
FROM tabelle t2
ORDER BY t2.timestamp
LIMIT 0, 10
)
;
tja, sowas in der Art hätte ich auch vorgeschlagen, wenn ich da nicht
im MySQL-Handbuch auf einen bestimmten Satz gestoßen wäre, siehe dazu
https://forum.selfhtml.org/?t=158665&m=1031692.
Deswegen schrieb ich dort auch, dass es nicht notwendig wäre, zu ermitteln,
wie der zehntneueste Timestamp aussieht ...
Freundliche Grüße
Vinzenz
yo Vinz,
<zitat>
Currently, you cannot delete from a table and select from the same
table in a subquery.
</zitat>
hmm, ich erinnere mich dunkel daran, dass ich das schon mal hier gesehen hatte und es nun wieder vergessen habe, dass mysql sowas nicht beherscht.
ich benutzt solche unterabfragen täglich, um datensätze aus unserer live-datenbank zu löschen, weil es ein sehr guter weg ist, erst einmal die unterabfrage für sich alleine auszuführen und die ergebnismenge zu verifizieren. sehr unbequem, dass mysql das noch nicht kann.
Ilja
Hallo Roger,
Von den Datensätzen sind ca 30 vorhanden (variiert). Ich möchte aber, das nur die 10 neuesten in der DB stehen.
Das verstehe ich zwar nicht, aber Du wirst Deine Gründe dafür haben.
Also brauche ich eine Routine, die mir die ältesten 20 ermittelt. Dabei tritt folgendes Problem auf:
Ich muss den Timestamp des 10. Eintrages bestimmen, um alle älteren löschen zu können.
Nein, das ist keineswegs erforderlich. Es wäre eine Möglichkeit.
Schaff ich das alles in eine Abfrage zu stopfen? Im Zeitalter von MySQL5 und Sub-Selects müsste das doch gehen.
Nein, das geht auch im Zeitalter von MySQL 5 nicht, sagt zumindest die MySQL-5-Doku:
<zitat>
Currently, you cannot delete from a table and select from the same
table in a subquery.
</zitat>
Oder wäre das zu unperformant?
Sorry, dass ich lächle. Aber Performance bei 10-30 Datensätzen ...
Gibt es evtl. eine elegantere Methode (vllt. Stored Procedures)?
Eine Stored Procedure wäre eine Möglichkeit.
DELTE FROM
table
WHEREtimestamp
<timestamp\_vom\_10ten\_eintrag
; :)
Hast Du Dir schon überlegt, was Deine Löschaktion auslösen - oder soll ich lieber "triggern" sagen - soll?
Freundliche Grüße
Vinzenz