Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pobieranie ostatnich 20 rekordów z tabeli - usuwanie reszty.
ratosluaf
post 27.01.2013, 11:01:57
Post #1





Grupa: Zarejestrowani
Postów: 91
Pomógł: 4
Dołączył: 14.10.2012

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Michael2318
post 27.01.2013, 12:03:55
Post #2





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

Ostrzeżenie: (0%)
-----


  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().

Ten post edytował Michael2318 27.01.2013, 12:29:10
Go to the top of the page
+Quote Post
Michasko
post 27.01.2013, 14:55:57
Post #3





Grupa: Zarejestrowani
Postów: 283
Pomógł: 31
Dołączył: 10.01.2006
Skąd: Działoszyn

Ostrzeżenie: (0%)
-----


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


Ten post edytował Michasko 27.01.2013, 15:16:35


--------------------
Po prawie 3-letniej przerwie w programowaniu, znowu raczkuję :)
Go to the top of the page
+Quote Post
acidm
post 28.01.2013, 10:06:16
Post #4





Grupa: Zarejestrowani
Postów: 110
Pomógł: 3
Dołączył: 12.03.2011
Skąd: Opole

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 20.04.2024 - 13:58