PHP / MYSQL max. entries



  • Hello world.
    Ich habe eine MySQL Tabelle, wo ich Einträge vornehme.
    Diese Datenbank bzw. Tabelle soll aber immer nur max. 10 Einträge haben. Sprich wenn ich den 11. Eintrag mache, soll er den ältersten Eintrag löschen.

    Wie würdet ihr das am besten realisieren?
    Und wie bekomme ich den ältersten Eintrag raus?

    Ich dachte iregndwie an eine Schleife, die prüft wieviele Einträge vorhanden sind und wenns über 9 (sprich 10 ) sind, soll er den ältersten löschen.

    Oder wie würdet ihr das machen?





  • ok frage ich anders:
    ehm gibt es ein befehl, wo ich alle anderen - bis auf die letzten 10 - auslesen kan?
    also gib mir alle -bis auf die ersten 10 - wieder



  • Hallo,

    SELECT COUNT(*) AS maxcount FROM `tabelle` ORDER BY `index` ASC LIMIT maxount-10;
    

    So oder so ähnlich könnte es funktionieren.

    LG, Micha



  • RandomAccess85 schrieb:

    Hallo,

    SELECT COUNT(*) AS maxcount FROM `tabelle` ORDER BY `index` ASC LIMIT maxount-10;
    

    So oder so ähnlich könnte es funktionieren.

    LG, Micha

    Hey danke.
    Bevor ich mit Löschoptionen anfange, dachte ich mri das ich erstmal nur die anderen (alle außer die ersten 10) ausgeben lasse:

    $sql_befehl = "SELECT COUNT(*) AS maxcount FROM My_log ORDER BY ID ASC LIMIT maxount-10";
    				$execute = mysql_query($sql_befehl);				
    				while($row = mysql_fetch_object($execute))
    				{
    					echo "$row->Loginhalt muss geloescht werden!<br />";
    				}
    

    Aber leider funktioniert das nicht:

    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in index.php on line 138

    138: while(row=mysql_fetch_object(row = mysql\_fetch\_object(execute))



  • Hallo,

    ich seh grad, dass das so auch nicht funktionieren wird. Die AS-Klausel lässt sich nur auf ORDER BY oder GROUP BY anwenden. Dann wirst du wohl doch das Workaround machen müssen.

    $res = mysql_query("SELECT * FROM tabelle");
    $count = $mysql_num_rows($res)-10;
    $iRes = mysql_query("SELECT * FROM tabelle ORDER BY irgendwas ASC LIMIT 0, $count");
    //usw....
    //mysql_free_result($res); nicht vergessen
    

    LG



  • RandomAccess85 schrieb:

    Hallo,

    ich seh grad, dass das so auch nicht funktionieren wird. Die AS-Klausel lässt sich nur auf ORDER BY oder GROUP BY anwenden. Dann wirst du wohl doch das Workaround machen müssen.

    $res = mysql_query("SELECT * FROM tabelle");
    $count = $mysql_num_rows($res)-10;
    $iRes = mysql_query("SELECT * FROM tabelle ORDER BY irgendwas ASC LIMIT 0, $count");
    //usw....
    //mysql_free_result($res); nicht vergessen
    

    LG

    hö?

    LIMIT 0,10 ORDER BY datum DESC
    

    das sollte doch reichen um die letzten 10 zu bekommen 🙂

    du kannst dann ein delete mit jagen mit "WHERE NOT IN ( SELECT .. FROM .. LIMIT )

    DELETE FROM table WHERE id NOT IN ( SELECT id FROM table ORDER BY datum DESC LIMIT 0,10)
    

    müsste doch gehen oder?? 🙂

    EDIT:: delete natürlich nur senden wenn rowcount > 10 ^^



  • Hallo,

    das ist jetzt die Frage 😃

    Entweder

    kunoiwo schrieb:

    bis auf die letzten 10

    auslesen oder

    kunoiwo schrieb:

    bis auf die ersten 10

    auslesen (wiedergeben)

    //Edit: Sorry hast natürlich Recht. Dein Vorschlag müsste funktionieren.

    VlG



  • Er will doch immer 10 einträge ausgeben haben.
    Und wenn er merkt das es 11 einträge sind will er den 1 löschen damit es wieder 10 sind.

    Also nach der schnellen lösung von mir wäre es dann so:

    1. Hole einträge aus datenbank
    2. Prüfe RowCount:

    Wenn RowCount > 10 dann lösche alle aus der datenbank die nicht in die selektierung (hole mir die jüngsten 10 einträge) fallen und hole mir erneut die einträge aus der datenbank.

    Wenn RowCount <= 10 Alles ok 😃

    Oder nischt ^^

    Edit// Ok dein edit grad gesehen 😉



  • Problem:

    This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

    MySQL Version: 5.1.37

    😃



  • oh 😃

    naja dann packt man es entweder in ein VIEW oder man macht ein JOIN (SELECT ...)



  • Erstmal danke für die hilfreichen Antworten.
    Hab mein Glück mal probiert:

    $all_entries = "SELECT * FROM MyBook_log";
    				$result = mysql_query($all_entries);					
    
    				if (mysql_num_rows($result)>10)
    				{
    					$sql = "DELETE FROM MyBook_log WHERE ID NOT IN ( SELECT ID FROM MyBook_log ORDER BY ID DESC LIMIT 0,10)";
    					$result2 = mysql_query($sql);
    					echo "Entries: ".mysql_num_rows($result)."";
    				}
    				else { echo "Unter 10, alles ok";}
    

    Das passiert nichts. Kommt auch keine Fehlermeldung. Irgendwie löscht er da nichts. Was mach ich falsch?



  • Hallo,

    mysql_error();
    

    gucken ob wirklich kein Fehler produziert wird.

    VlG



  • RandomAccess85 schrieb:

    Hallo,

    mysql_error();
    

    gucken ob wirklich kein Fehler produziert wird.

    VlG

    Ahhhh

    This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

    Wurde glaube ich auch schon angesprochen.
    Ehm wie ist dazu denn die Alternative:

    VIEW oder man macht ein JOIN (SELECT ...)

    Ist mir beides nciht vertraut...



  • Hallo,

    wenn du jetzt schon den COUNT hast würde sich ersterer Vorschlag anbieten. Damit umgehst du VIEW's und JOIN's komplett.

    $all_entries = "SELECT * FROM MyBook_log"; 
    $result = mysql_query($all_entries);  
    $count = mysql_num_rows($result);                  
    if ($count>10) 
    { 
       $count-=10;
       $sql = "DELETE FROM MyBook_log ORDER BY ID ASC LIMIT ".$count.")"; 
       $result2 = mysql_query($sql); 
    }
    

    Löscht alle Datensätze, bis auf die letzten 10!

    LG



  • Joa viele wege führen nach Rom 🙂
    Deiner natürlich auch 😃

    Hehe wollte grad was anmerken an deinem post, aber is schon geändert :D!

    @TP - mal bei zeit anschauen oder selbst googeln:
    http://dev.mysql.com/doc/refman/5.1/de/join.html
    http://dev.mysql.com/doc/refman/5.1/de/create-view.html



  • RandomAccess85 schrieb:

    Hallo,

    wenn du jetzt schon den COUNT hast würde sich ersterer Vorschlag anbieten. Damit umgehst du VIEW's und JOIN's komplett.

    $all_entries = "SELECT * FROM MyBook_log"; 
    $result = mysql_query($all_entries);  
    $count = mysql_num_rows($result);                  
    if ($count>10) 
    { 
       $count-=10;
       $sql = "DELETE FROM MyBook_log ORDER BY ID ASC LIMIT ".$count.")"; 
       $result2 = mysql_query($sql); 
    }
    

    Löscht alle Datensätze, bis auf die letzten 10!

    LG

    War zwar ein kleiner Syntaxfehler drinne aber hat mir richtig gut geholfen:
    $sql = "DELETE FROM MyBook_log ORDER BY ID ASC LIMIT $count";

    Danke euch beiden!
    Wenn ihr mal in der Nähe von Kiel seid, dürft ihr euch nen Bier abholen.



  • haha alles klar 😉

    Die klammer is ihm wohl so reingerutscht 🤡

    btw bin auch eher ein freund von ' -- ' . $var . ' -- '
    Wird etwas schneller berechnet als " -- $var " oder wie im bsp. " -- " . $var . " -- "

    greez



  • Hallo,

    asoooo die Klammer. Ich hab mich die ganze Zeit gewundert von welchem Syntaxfehler die Rede ist 😃
    Ja die Klammer gehört da natürlich nicht hin.

    //spätestens bei so lustigen Dingen wie
    mysql_query("SELECT * FROM tabelle WHERE feld='".$row['vorhergeholterWert']."'"); 
    // ist "--".$var."--" nicht mehr so einfach zu vermeiden.
    // Aber egal, wir schweifen ab ^^
    

    VlG

    P.S. Ein Bier bitte nach Leipzig. DHL Luftpost bitte, dann ist es zum Feierabend da 😃


Anmelden zum Antworten