Announcement

Collapse
No announcement yet.

Löschen ausser der 20 letzten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Löschen ausser der 20 letzten

    Hallo!

    Hätte wieder mal ne Frage.. Der Betreff sagt eigenlich eh schon alles.. Ich möchte gerne die Sätze löschen, ausser die letzten (jüngsten) 20 ..

    User | Eintrag | DatumEintrag

    Gibt es dafür ein Statement?

    Danke!
    Juergen

  • #2
    Könnte es so irgendwie gehen - hab keine Testmöglichkeit - aber viel Phantasie


    DELETE FROM (select * from tab, count(*) AS Anzahl)
    ORDER BY col_timestamp LIMIT (Anzahl - 20);

    Comment


    • #3
      Hallo,
      Originally posted by hausl78 View Post
      Könnte es so irgendwie gehen...
      Nein!
      Du benötigst ein Kriterium, welches den 20. Datensatz eindeutig kennzeichnet (z.B. eine ID). Du mußt also in zwei Schritten: dieses Kriterium ermitteln und dann alle DS löschen, die kleiner / größer als dieses Kriterium sind.
      Angenommen alle DS haben eine ID (z.B. einen AutoInc-Wert) und die jüngsten sind damit die mit der höchsten ID, dann bekommst du den 20. DS mit:
      [highlight=sql]
      select min(a.id) die_zwanzigste_id
      from (
      select id
      from <tabelle>
      order by id desc
      limit 20
      ) a
      [/highlight]
      Mit der so ermittelten ID kannst du dann ein einfaches Delete-Statement absetzen:
      [highlight=sql]
      delete from <tabelle>
      where id < :die_zwanzigste_id
      [/highlight]

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Könnte es so in einem Statement gehen?

        PHP Code:
        DELETE FROM tab_tipps
        WHERE TippID 
        <
          (
        SELECT TippID FROM tab_tipps
           ORDER BY TippID
           LIMIT 20
        ,1
        Danke!
        Zuletzt editiert von hausl78; 08.03.2011, 21:02.

        Comment


        • #5
          Hmm.. Warum geht das so nicht?

          /* SQL Error (1093): You can't specify target table 'tab_tipps' for update in FROM clause */


          // EDIT:
          Hat sich erledigt, mysql erlaubt das einfach nicht.. bleibt nur die Lösung mit den beiden Abfragen - gem. Falk Prüfer oben...
          Zuletzt editiert von hausl78; 08.03.2011, 21:22.

          Comment


          • #6
            Mir wär auch keine andere Datenbank bekannt die das erlauben würde.

            Dim
            Zitat Tom Kyte:
            I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

            Comment


            • #7
              Originally posted by dimitri View Post
              Mir wär auch keine andere Datenbank bekannt die das erlauben würde.

              Dim
              Abgesehen davon das das kleiner in der WHERE-Clause Probleme macht, wenn das Subselect mehr als eine Zeile zurückliefert, geht das in MS-SQL Server so:
              [HIGHLIGHT="SQL"]BEGIN TRANSACTION;

              CREATE TABLE #Test ( ID INT);
              INSERT INTO #Test SELECT 0
              GO

              INSERT INTO #Test SELECT TOP 1 ID + 1 FROM #Test ORDER BY ID DESC
              GO 5

              SELECT * From #Test
              -- ID
              -- -----------
              -- 0
              -- 1
              -- 2
              -- 3
              -- 4
              -- 5

              DELETE T
              FROM #Test T
              JOIN ( SELECT TOP 3 ID FROM #Test
              ORDER BY ID ) AS X ON T.ID = X.ID ;

              SELECT * From #Test
              -- ID
              -- -----------
              -- 3
              -- 4
              -- 5

              ROLLBACK; [/HIGHLIGHT]

              Aber wahrscheinlich ist MS-SQL da etwas eigen...

              Comment

              Working...
              X