Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie ostatnich 20 rekordów z tabeli - usuwanie reszty.
Forum PHP.pl > Forum > PHP
ratosluaf
Jak może wyglądać polecenie, aby usunąć wszystkie rekordy z tabeli oprócz ostatnich 20? (mysql)

Jak ma wyglądać pętla, która będzie wyświetlała te wyniki z separatorem jako ",", ale bez separatora po ostatnim rekordzie?
Kod
for( $x = 1; $x <= 10; $x++ )
echo $x.",";

wyswietla 1,2,3...10,

Czy tak jest na ogół dobrze?
Michael2318
  1. $sql = "SELECT id FROM `tablica` ORDER BY id"; // wyciągamy wszystkie rekordy, według ID
  2. $result = mysql_query($sql);
  3. $ideki = ''; // zmienna zawierająca ID ostatnich 20 wpisów, na start jest pusta
  4. $count = 0; // licznik bieżący, na start wyzerowany
  5. $all = mysql_numrows($result); // ilość wszystkich wpisów
  6. while($row = mysql_fetch_assoc($result) )
  7. {
  8. $count++; // co jedno wykonanie pętli - licznik wzrasta o 1
  9. $all = ($all - 20); // odejmujemy od wszystkich wpisów liczbę 20
  10. if ( $count >= $all ) // jesli licznik bieżący jest równy bądź większy liczbie wszystkich wpisów - 20 to...
  11. {
  12. $ideki .= $row['id'].', '; // doklejamy do zmiennej po przecinku ID każdego wpisu, który zalicza się do ostatniej dwudziestki
  13. }
  14. }
  15. $ideki = rtrim(trim($ideki), ','); // najpierw usuwamy białe znaki, potem kasujemy ostatni przecinek z ciągu
  16.  
  17. $sql = "DELETE FROM `tablica` WHERE id NOT IN (".$ideki.")"; // usuwamy wszystkie wpisy z bazy oprócz tych ostatnich dwudziestu
  18. $result = mysql_query($sql);


Czyli najpierw zliczasz ile masz wszystkich rekordów (zmienna $all), licznik bieżący zeroujesz ($count = 0) i potem co wykonanie pętli to zwiększasz $count. Jeśli zmienna $count będzie równa bądź większa od wszystkich rekordów-20 to zaczynasz zapisywać id tych wpisów. Potem tworzysz zapytanie usuwające wszystkie wpisy, prócz tych z zapisanymi w zmiennej po ID.

Możesz też jednym zapytaniem:

Kod
DELETE FROM tablica ORDER BY id DESC LIMIT 20, 9999999;



EDIT:

Pętlę for() masz dobrze zapisana, a jak pozbyć się ostatniego przecinka z ciągu? Wyżej Ci to pokazałem - funkcja rtrim().
Michasko
Mam tylko uwagę do linii 9. - po co za każdym obrotem pętli odejmować 20 od $all ? wystarczyłoby już przy definiowaniu zmiennej dać:
  1. $all = mysql_numrows($result) - 20;
i kod byłby troszkę bardziej optymalny ;)
Jednak lepiej zrobić to jednym zapytaniem, jak napisał kolega wyżej, a potem wyświetlić wyniki kolejnym, zamiast bawić się w pętle:
  1. SELECT GROUP_CONCAT(id) FROM tablica
acidm
Cytat(Michael2318 @ 27.01.2013, 12:03:55 ) *
Możesz też jednym zapytaniem:

Kod
DELETE FROM tablica ORDER BY id DESC LIMIT 20, 9999999;

A czy mysql nie ma przypadkiem problemu gdy z zapytaniu DELETE dajemy LIMIT z dwoma parametrami?questionmark.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.