lukaszk
11.04.2012, 20:31:37
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
11.04.2012, 22:44:23
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
11.04.2012, 23:48:27
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
12.04.2012, 00:46:33
Zliczamy ile osób ma więcej punktów od danego użytkownika, zwiększamy tą liczbę o jeden i mamy pozycję w rankingu
lukaszk
12.04.2012, 01:04:32
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
function pozycja($id_user,$jestem ) {
$zapytanie = "SELECT * FROM vote where jestem='$jestem' ORDER BY glos_plus DESC";
$i++;
$tablica[''.$a['id_user'].''] = $i;
}}
return $tablica[$id_user];
}
sebastian.rozmus
12.04.2012, 01:19:49
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
12.04.2012, 01:30:22
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
12.04.2012, 01:37:52
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.