Chris Masur: Alle Einträge bis auf den letzten löschen

Hallo,

in einer Datenbank sollen alle Datensätze gelöscht werden, ausgenommen davon ist der letzte/aktuellste.

Primary Key ist keiner vorhanden, besuch_zeit ist ein DATETIME-Feld.

Ich wähle also die gewünschten Datensätze aus, ordne sie nach Datum und lasse ab dem 2. Datensatz alles löschen:

DELETE FROM
tabelle
WHERE
bei=4 AND von=1
ORDER BY
zeit
DESC
LIMIT 1,100

Funktioniert leider nicht, er zeigt mir diesen Fehler:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '100' at line 1

  1. Hello,

    da ich meistens einen Bogen um die LIMIT-Klausel mache würde ich das Problem anders angehen - einzige Besonderheit bei meiner Lösung wären zwei oder mehr Einträge mit dem gleichen besuch_zeit Eintrag, die dann ALLE überleben würden:
    DELETE FROM tabelle
    WHERE bei = 4 AND von = 1 AND besuch_zeit < (
       SELECT MAX(besuch_zeit) FROM tabelle WHERE bei = 4 AND von = 1
    )

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Ambition is the last refuge of failure.  --  Oscar Wilde (Irish Poet, Novelist, Dramatist and Critic, 1854-1900)
    1. DELETE FROM tabelle
      WHERE bei = 4 AND von = 1 AND besuch_zeit < (
         SELECT MAX(besuch_zeit) FROM tabelle WHERE bei = 4 AND von = 1
      )

      Da bringt er mir:

      #1093 - You can't specify target table 'tabelle' for update in FROM clause

      Ist halt komisch das das mit LIMIT nicht funktioniert obwohl es logisch hoch drei ist :-(

      1. Hallo

        DELETE FROM tabelle
        WHERE bei = 4 AND von = 1 AND besuch_zeit < (
           SELECT MAX(besuch_zeit) FROM tabelle WHERE bei = 4 AND von = 1
        )
        #1093 - You can't specify target table 'tabelle' for update in FROM clause
        Ist halt komisch das das mit LIMIT nicht funktioniert obwohl es logisch hoch drei ist :-(

        Es ist logisch, dass beides nicht geht. Das steht auch ganz genauso im Handbuch:

        a) Subselect
           <zitat>
               Currently, you cannot delete from a table and select from the
               same table in a subquery.
           </zitat>

        b) LIMIT:
           <zitat>
               ~~~sql DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
                   [WHERE where_condition]
                   [ORDER BY ...]
                   [LIMIT row_count]

          
               [...]  
               The MySQL-specific LIMIT row\_count option to DELETE tells the server  
               the maximum number of rows to be deleted before control is returned  
               to the client  
           </zitat>  
          
          
        Freundliche Grüße  
          
        Vinzenz