Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Ranking użytkowników
devbazy
post
Post #1





Grupa: Zarejestrowani
Postów: 93
Pomógł: 4
Dołączył: 10.08.2009

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


Witam,

przejdę od razu do meritum. Otóż planuję napisać skrypt (jak w tytule wątku) i zastanawiam się nad pewną kwestią. Załóżmy, że algorytm obliczałby ilość zdobytych plusów za komentarze, posty napisane przez użytkownika oraz jego aktywność (podobne działanie jak na portalu wykop.pl) i według tego ustalałby jego pozycję w rankingu (nie mam zamiaru robić tego dynamicznie, czyli po każdej aktywności odpalać odpowiedni skrypt - wręcz przeciwnie, posłużę się CRON'em, bo myślę, że to najlepsza rozwiązanie, chociaż jestem otwarty na wszelkie sugestie). Na samym początku, po rejestracji na witrynie użytkownik miałby status - poza rankingiem (o ile na stronie byłoby zarejestrowanych więcej niż 300 użytkowników, dajmy na to, że limit to właśnie te 300 miejsc), a dopiero z czasem (w miarę jego aktywności) mógłby zdobyć jakąś sensowną pozycję. Będę wdzięczny za jakiekolwiek propozycje, począwszy od wstępnego projektu struktury tabel, aż po sugestie dot. rozwiązania tego dość irytującego problemu.

Z góry dziękuje za wszelaką pomoc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
tehaha
post
Post #2





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


dokładnie Ci nie napiszę bo nie wiem jakie masz tabele i w jaki sposób chcesz wyliczać te punkty, więc napiszę Ci tylko kod zastępczy do tej pętli

po co Ci ten ranking w tabeli users, wszystko będzie prostsze jak dasz to do oddzielnej, np:

tabela user_rank
rank_id int11
user_id int11
points int11

  1. $query = mysql_query("SELECT user_id FROM some_table ORDER BY comment_points DESC, post_points DESC LIMIT 300"); //zakładając, że jest więcej userów w bazie
  2.  
  3. $i = 1;
  4. $query_parts = array();
  5. while($row = mysql_fetch_array($query))
  6. {
  7. $sum_points = $row['comment_points']+$row['post_points'];
  8. $query_part[]= "({$row['user_id']}, {$sum_points})";
  9. }
  10. $query = implode(', ', $query_parts);
  11.  
  12. $query = mysql_query("DELETE FROM table_ranking");
  13. $query = mysql_query("INSERT INTO table_ranking(user_id, points) VALUES".$query);


oczywiście to nie jest gotowy kod, tylko taki , żeby Ci pokazać o co chodzi

p.s. nie wiem czy zdajesz sobie sprawę ale ustawienie ORDER po obu kolumnach oznacza, że najpierw będzie sortowanie względem comment_points a dopiero tam gdzie wartości comment_points są takie same następuje sortowanie po post_points, więc uzyskasz zafałszowany wynik bo ktoś kto ma np. 0 punktów za komentarze a 5 milionów za posty to i tak wyląduje na końcu listy

lepszym rozwiązaniem będzie zsumowanie tego czyli coś takiego:
  1. SELECT user_id, SUM(comment_points+post_points) AS sum_points FROM some_table GROUP BY user_id ORDER BY sum_points DESC LIMIT 300
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 25.12.2025 - 12:54