Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP + MySQL] Sortowanie :P
Forum PHP.pl > Forum > Przedszkole
Mescam
Witajcie.

Mam sobie taką małą bazę danych, gdzie są trzy pola.
ID <-- Id usera
suma <-- suma "czegośtam" usera
rank <-- o tym za chwilę

Tabela ma w sobie kilku userów o różnych wartościach w polu "suma"
Teraz chciałbym przeprowadzić ranking za pomocą pola rank.
Czyli: Nie wiem jak napisać w php/mysql skrypt, który sortuje rekordy pod względem wartości pola "suma", od największego do najmniejszego, i jego pozycje zapisuje do pola rank.


Pomożecie? biggrin.gif

Z góry dziękuję i pozdrawiam
kornel-php
Małe przegięcie... Użyj wyszukiwarki na forum, albo google
drPayton
A szukaj według słów: [sql]ORDER BY, UPDATE, [php]foreach
Mescam
Szukam szukam i jakoś mi to nic nie daje tongue.gif

Mam cosik takiego

  1. <?
  2. $start = 1;
  3. $query = doquery("SELECT * FROM users ORDER BY suma DESC");
  4.  
  5. while ($row = mysql_fetch_assoc($query)){
  6. $id = $row['ID'];
  7. $start++;
  8.  
  9. doquery("UPDATE users SET `rank`= {$start} WHERE `ID` = {$id}");
  10.  
  11.  
  12. }
  13.  
  14. ?>


Ale nie bardzo działa tongue.gif
drPayton
Co to znaczy "nie bardzo działa"?
Co to jest "doquery"? Osobna funkcja która wywołuje zapytania sql? Jeśli tak, to pewnie zwraca wartość wybraną selectem (tablicę). Więc:
  1. <?php
  2. $start = 1;
  3. $users = doquery("SELECT * FROM users ORDER BY suma DESC");
  4. foreach($users AS $user) {
  5. doquery("UPDATE users SET `rank`= {$start} WHERE `ID` = {$user['id']}");
  6. $start++;
  7. }
  8. ?>

A jeśli nie, to powiedz co zwraca funkcja doquery...

btw:
Jeżeli już musisz używać tego czegoś (jak to ` się u licha nazywa??), to rób to konsekwentnie, nazwę tabeli też, nie tylko nazwy pól. Inaczej to bez sensu...
A najlepiej nie używaj i nie słuchaj tych, którzy mówią że warto. Nie warto...
Mescam
Ah, zapomniałem powiedzieć, doquery to funkcja mysql_query() smile.gif
Przepraszam biggrin.gif

Zaraz przetestuje to co napisałeś/


edit

Warning: Invalid argument supplied for foreach()

:/
drPayton
Czyli zamieniłeś tylko nazwę funkcji na potrzeby posta? W takim razie wróć do poprzedniego kodu i ponawiam pytanie: Co to znaczy "nie bardzo działa"?
Mescam
Hm, ustalmy, że mam taki kod:
  1. <?
  2. $start = 1;
  3. $query = mysql_query("SELECT * FROM users ORDER BY suma DESC");
  4.  
  5. while ($row = mysql_fetch_assoc($query)){
  6. $id = $row['ID'];
  7. $start++;
  8.  
  9. mysql_query("UPDATE users SET `rank`= {$start} WHERE `ID` = {$id}");
  10.  
  11.  
  12. }
  13.  
  14. ?>


Mam 3 userów:
User o ID1 - Suma: 0
User o ID2 - Suma: 170
User o ID3 - Suma: 0
User o ID1 w polu rank ma '2'
User o ID2 w polu rank ma '2'
User o ID3 w polu rank ma '3'

A raczej user o id2 powinien mieć rank 1 a
2/3 pozycja losowa
drPayton
Wszystko działa poprawnie zgodnie z kodem. Słuchaj:
Deklarujesz zmienną start z początkową wartością 1. Najpierw ją zwiększasz o jeden, a dopiero potem wpisujesz do bazy. Czyli nadawanie "rank'u" zaczynasz od 2!
Trochę się zamotałem czytając ten ostatni post, ale chyba wiem o co biega, więc:
  1. <?
  2.  
  3. $start = 1;
  4.  
  5. $query = mysql_query("SELECT * FROM users ORDER BY suma DESC");
  6.  
  7. while ($row = mysql_fetch_assoc($query)){
  8. $id = $row['ID'];
  9.  
  10. if(< $row['suma']) { // Przy założeniu, że pole suma w bazie jest typu liczbowego!
  11. mysql_query("UPDATE users SET `rank`= {$start} WHERE `ID` = {$id}");
  12. $start++;
  13. } else {
  14. mysql_query("UPDATE users SET `rank`= 0 WHERE `ID` = {$id}");
  15. }
  16.  
  17. }
  18.  
  19. ?>

W ten sposób nadasz kolejno rosnące wartości rank dla userów, dla których suma jest > 0, i rank == 0, dla tych, gdzie suma jest = 0.
Mescam
O, dziękuję za pomoc. O takie coś właśnie mi chodziło.

A tak nawiasem: include(); wykonuje kod zawarty w includowanym pliku?

Pozdrawiam.
drPayton
Tak, include (require) dołącza plik w miejscu wywołania i (jeśli to php) wykonuje go przed przejściem dalej (poniżej wywołania include).

btw: nie include('plik.php'); tylko include 'plik.php';

Include to nie jest funkcja; zastosowanie nawiasów nic wprawdzie nie zmieni, ale po co jak nie trzeba...
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.