Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> sklejenie zapytania wyciągającego średnią pozycję w rankingu
lukaszk
post
Post #1





Grupa: Zarejestrowani
Postów: 159
Pomógł: 0
Dołączył: 21.12.2010

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


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





Grupa: Zarejestrowani
Postów: 8
Pomógł: 3
Dołączył: 28.12.2010

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


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


Ten post edytował kazymjir 11.04.2012, 22:44:50


--------------------
Zobacz mój blog o tematyce szeroko pojętego web developingu: http://kazymjir.com/
Go to the top of the page
+Quote Post
lukaszk
post
Post #3





Grupa: Zarejestrowani
Postów: 159
Pomógł: 0
Dołączył: 21.12.2010

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


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
Go to the top of the page
+Quote Post
sebastian.rozmus
post
Post #4





Grupa: Zarejestrowani
Postów: 48
Pomógł: 12
Dołączył: 7.03.2012

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


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





Grupa: Zarejestrowani
Postów: 159
Pomógł: 0
Dołączył: 21.12.2010

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


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. }
Go to the top of the page
+Quote Post
sebastian.rozmus
post
Post #6





Grupa: Zarejestrowani
Postów: 48
Pomógł: 12
Dołączył: 7.03.2012

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


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.

Ten post edytował sebastian.rozmus 12.04.2012, 01:21:34
Go to the top of the page
+Quote Post
lukaszk
post
Post #7





Grupa: Zarejestrowani
Postów: 159
Pomógł: 0
Dołączył: 21.12.2010

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


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
Go to the top of the page
+Quote Post
sebastian.rozmus
post
Post #8





Grupa: Zarejestrowani
Postów: 48
Pomógł: 12
Dołączył: 7.03.2012

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


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ć.

Ten post edytował sebastian.rozmus 12.04.2012, 01:38:26
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 Aktualny czas: 21.08.2025 - 12:03