Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sklejenie zapytania wyciągającego średnią pozycję w rankingu
Forum PHP.pl > Forum > PHP
lukaszk
Witam, mam tabelę o takiej strukturze

id_user
glos_plus (default 0 każdy głos +1)
glos_minus (default 0 każdy głos +1)
grupa

Każdy użytkownik to osobny rekord (każdy użytkownik posiada rekord)

Potrzebuję zrobić ranking użytkowników ale nie wiem jak logicznie powinno wyglądać zapytanie które sprawdza użytkownika i porównuję go do innych.
Dodatkowo mamy trzy grupy użytkowników i każda ma swój ranking więc to kolejny warunek.
Proszę o pomoc
kazymjir
W SQL:
Wykorzystaj ORDER BY na kolumnach glos_plus lub glos_minus by posortować wyniki wg. największych/najmniejszych wartości.
Wykorzystaj WHERE na kolumnie grupa by uzyskać wynik tylko dla wybranej grupy.
Wykorzystaj LIMIT gdy chcesz ograniczyć wynik do określonej liczby użytkowników.

Przykładowy kod który wyświetli 3 użytkowników z największą ilością głosów na plus z grupy "WybranaGrupa"
Kod
SELECT * FROM `Tabela` WHERE `Grupa`='WybranaGrupa' ORDER BY `glos_plus` DESC LIMIT 3
lukaszk
Dzięki ale przestawione rozwiązanie jest niepełne. Najbardziej mi zależy na tym aby u każdego użytkownika był nr jaki zajmuje on w rankingu

Wrzucam to w funkcję
zlicza rekordy
zlicza sumę rekordów
i teraz jak ogarnąć które miejsce w tym zajmuję dany użytkownik
sebastian.rozmus
Zliczamy ile osób ma więcej punktów od danego użytkownika, zwiększamy tą liczbę o jeden i mamy pozycję w rankingu wink.gif
lukaszk
Ja to zrobiłem tak gdyż muszę odwoływać się do wyniku wiele razy.
Czy jest w miarę optymalne?
zmienna $jestem przetrzymuję grupę w której jest dany użytkownik

  1. function pozycja($id_user,$jestem ) {
  2. $zapytanie = "SELECT * FROM vote where jestem='$jestem' ORDER BY glos_plus DESC";
  3. if ($r_bottom = mysql_query ($zapytanie)) {
  4. while ($a = mysql_fetch_array($r_bottom)) {
  5. $i++;
  6. $tablica[''.$a['id_user'].''] = $i;
  7. }}
  8. return $tablica[$id_user];
  9.  
  10. }
sebastian.rozmus
Jak rozumiem chcesz wyświetlić po koleji wszystkich użytkowników rankingu w tabelce? A nie możesz w tej tabelce gdzie wyświetlasz miejsca w rankingu wpisywać je na bierząco ? tzn. w pętli przechodzącej po wszystkich wynikach, jeśli aktualny wyświetlany użytkownik ma mniej punktów niż poprzedni(zapamiętujemy wynik na końcu każdego cyklu pętli) to $pozycja += 1, jeśli ma tyle samo to są oni egzekwo i nie zmieniamy pozycji. Wtedy zaoszczędzamy trochę wydajności i jedno zapytanie MySQL mniej. Chyba że masz inny cel do zrealizowania niż sama lista.
lukaszk
Nie w tabelce
Lista znajomych jak np Nk zawiera użytkowników różnych grup a każda ma swoje notowania
Więc w liście użytkowników jest taka lista jaką stworzy sobie użytkownik poprzez zaproszenia
sebastian.rozmus
To w takim razie zauważ, że używasz tak naprawdę bardzo małej ilości danych spośród tych, które pobierasz w tym zapytaniu. Optymalniej byłoby tak jak mówiłem zliczyć użytkowników, którzy mają więcej punktów, niż dany user i zwiększyć wynik o 1. Jeśli danych będzie sporo to przydałoby się to jakoś sensownie cachować.
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.