Löschen, ausser die 20 neusten

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

  • Löschen, ausser die 20 neusten

    Hi,

    ich versuche gerade auf möglichst elegantem Weg alle Datensätze einer Tabelle zu löschen. Die 20 (zB) neusten Datensätze sollen allerdings erhalten bleiben.

    Ein Weg wäre natürlich die 20 neusten zu selecten und dann über NOT IN(<id>) alle anderen zu löschen.

    Es müsste doch aber auch folgendes irgendwie gehen:
    Code:
    DELETE FROM tab ORDER BY id DESC LIMIT 20,??
    Un das ?? ist mein Problem. Kann ich der Query irgendwie sagen das er "bis zum ende" selecten soll?

    Order gibt es eine andere Möglichkeite das Problem zu lösen?

    Dank euch...

  • #2
    Ein Weg wäre natürlich die 20 neusten zu selecten und dann über NOT IN(<id> ) alle anderen zu löschen.
    so wäre die lösung.

    aber warum löschen. und warum nicht einfach nur die 20 aktuellsten anzeigen?

    ich vermute mal, dass du immer alles anzeigen willst, was in der tabelle der DB steht. und damit nciht mehr als 20 einträge kommen, willst du die anderen entfernen. richtig?
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Comment


    • #3
      Ach komm, so isses ja nu auch nicht Nen SELECT * FROM tab LIMIT 0,20 krich ich schon hin

      Es wird eine Aktivtätstabelle. D.h. bei verschiedenen Aktionen wird ein Eintrag in diese Tabelle gemacht. X hat das gemacht, Y hat das gemacht. etc.
      Das ganze soll dann an entsprechender Stelle auf der Seite ausgegeben werden.

      Mein Gedanke war eben nur die Datenmenge zu begrenzen und zwar so, das das Script das selbst macht und ich nicht mit einem 2ten Script hinterherrennen muss und die Datesätze aus dem letzten Monat löschen muss.

      Effektiv hat diese Information keinen Nutzwert - ist nur Gimmick...

      Comment


      • #4
        und die Datesätze aus dem letzten Monat löschen muss.
        d.h. du hast ein feld für datum/zeit in deiner tabelle?

        warum nur die letzten 20 einträge?

        wenn du ein zeitfeld (DATE/TIME/DATETIME/TIMESTAMP) hast, kannst doch alles löschen was älter als X tage ist. damit sollte doch dein problem gelöst sein. oder?

        eine andere möglichkeit sehe ich hier nicht.

        wobei mal die genannte lösung sinnvollerweise in einem cleanup-script laufen lässt, statt sie mit jedem aufruf der seite auszuführen.
        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


        Comment


        • #5
          Ok,

          dann mach ich doch die alt hergebrachte. Ich dachte nur, dasm an mit Limit evtl das ganze schöner machen kann...

          Trotzdem danke für eure Anregungen

          Comment


          • #6
            Noch eine Möglichkeit:
            die Anzahl DS mit einem SELECT COUNT(*) feststellen
            DELETE .. ORDER BY id ASC LIMIT alle-20 .
            da (bzw. wenn) die ID autoincrement ist, sollte ORDER BY id ASC die alten zuerst bringen.

            Oder man stellt die id des 21 letzten fest und macht daraus ein WHERE .
            SELECT id ... ORDER BY id DESC LIMIT 1 OFFSET 21. / LIMIT 21,1
            DELETE.. WHERE id<= $id .

            Mit allen checks für den Fall, dass es keine DS hat oder weniger als 21.

            PS Es gibt beim DELETE im LIMIT kein offset, und ORDER BY .. LIMIT .. sind im DELETE eventuell nicht auf Effizienz getrimmt, wohingegen WHERE.. im DELETE ziemlich sicher effizient ist.

            [edit für Sprache und Tippfehler]
            Last edited by nix_wie_weg; 08-08-2006, 02:22.

            Comment


            • #7
              Hey danke,

              das ist doch mal nen Ansatz...

              Werds probieren!

              Comment

              Working...
              X