Roger: /MySQL5: Problem mit Abfragelogik

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.

--
meine freundin sagt, ich wäre neugierig.
so steht's zumindest in ihrem tagebuch.
  1. yo,

    DELETE FROM tabelle t1
    WHERE t1.id NOT IN (SELECT t2.id
                        FROM tabelle t2
                        ORDER BY t2.timestamp
                        LIMIT 0, 10
                       )
    ;

    Ilja

    1. 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

      1. 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

  2. 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 WHERE timestamp < 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