#EDIT

1) To moze chociaz sie odniesiecie, czy robienie czegos takiego ma sens??
2) a moze to zapisywac do tablicy asocjacyjnej?
3) moze do tablicy 2-wymiarowej??

Czekam na sugestie

To pilne, z góry dziękuję

#BEFORE EDIT

Mam następujące zapytanie

  1. <?php
  2. $sql = 'SELECT PID, Name, SUM( Skalpy ) as SSk , SUM( Gry ) as SG , SUM( Skalpy ) / SUM( Gry ) AS Rank, tournaments.Data'
  3. . ' FROM listarank'
  4. . ' LEFT JOIN tournaments ON tournaments.TurnID = listarank.TurnID AND tournaments.
  5. ata'
  6. . ' BETWEEN ''.$data_turn[\"Data\"].'' - INTERVAL 2 YEAR AND ''.$data_turn[\"Data\"].'''
  7. . ' WHERE tournaments.Data IS NOT NULL '
  8. . ' GROUP BY PID'
  9. . ' ORDER BY Rank DESC';
  10. $result3 = mysql_query($sql, $link);
  11. $rows_num3 = mysql_num_rows($result3);
  12. ?>


które oblicza mi ranking gracza.

Zasada obliczania rankingu wygląda następująco
(*) zlicz wszystkie partie jakie gracz rozegral w ciagu ostatnich 2 lat
(**) jesli liczba partii przekracza 100 za okres 2 lat zlicz ostatnie 100 rozegranych partii
(***) UWAGA: jesli gracz rozegral 97 partii a we wczesniejszym turnieju 4 partie, to ranking zostanie zliczony z 97 partii a nie ze 101 - z pominięciem jednego - gdyz ranking powinien byc obliczany turniejami

Tyle jezeli chodzi o ideologie obliczania

Moje zapytanie jak widac zlicza tylko za okres 2 lat - bez uwglednienia 100 partii i nie mam zielonego pojecia jakby to zmodyfikować w zapytaniu aby tak robiło.

Aha przyrosty rankingow podane sa w $skalpy z ilu gier (w $gry) i są one powiązane z $TurnID takze warunek *** jest zawsze spelniony jesli suma gier z kolumn pola $gry <= 100 (tylko trzeba to jakoś uwzględnić w zapytaniu biggrin.gif)

Póki co z problemem poradziłem sobie w następujący sposób (szczerze mówiąc mało elegancki sad.gif i utrudniający sortowanie wyników)

Po zadaniu w/w zapytania następuje poniższy kod

  1. <?php
  2. $i = $k = 0;
  3. while ($dane = mysql_fetch_array($result3)) {
  4. //zmienne uzywane do wysietlenia danych 
  5. $vPID = 0;
  6. $vName = 0;
  7. $vSG = 0;
  8. $vRank = 0;
  9. if ($dane[&#092;"SG\"] <= 100) { // gdy suma rozegranych gier jest mniejsza niz 100
  10. $vPID = $dane[&#092;"PID\"]; // odczytaj dane
  11. $vName = $dane[&#092;"Name\"];  // imie i nazwisko
  12. $vSG = $dane[&#092;"SG\"]; // suma rozegranych gier/partii w klubie
  13. $vRank = $dane[&#092;"Rank\"];  // ranking zawodnika
  14. $vskalpy = $dane[&#092;"SSk\"]; // suma przyrostow rankingow zawodnika
  15. // UWAGA: ranking jest to suma przyrostow rankingow zawodnika w n turniejach
  16. // podzielona przez m partii ktore gracz rozegral w n turniejach w przeciagu 2 ost
  17. tnich lat
  18. // jesli ilosc m partii taka ze m > 100 w ciagu ostatnich 2 lat to zlicz ostatnie 100 partii
  19. // grupowanych turniejami -> TurnID
  20. }
  21. else { //gdy suma gier przekracza 100
  22. // wybierz z tabeli wszystkie gry jakie rozegral graz o danym PID
  23. // oraz posortuj wg daty turnieju tak aby pierwsze byly turnieje rozegrane ostatni
  24.  (DESC)
  25. $sql = 'SELECT PID, Name, tournaments.Data, Skalpy, Gry'
  26. . ' FROM listarank'
  27. . ' LEFT JOIN tournaments ON tournaments.TurnID = listarank.TurnID AND tournaments.
  28. ata'
  29. . ' BETWEEN ''.$data_turn[\"Data\"].'' - INTERVAL 2 YEAR AND ''.$data_turn[\"Data\"].'''
  30. . ' WHERE tournaments.Data IS NOT NULL and PID='.$dane[&#092;"PID\"]
  31. . ' ORDER BY Data DESC';
  32. $pers_res = mysql_query($sql, $link);
  33. $vskalpy = 0; //wyzerowanie zmiennej zliczajacej sume przyrostow rankingu
  34. while ($pers_dane = mysql_fetch_array($pers_res)) {
  35. if (($vSG <= 100) and (($vSG + $pers_dane[&#092;"Gry\"]) <= 100)) {
  36. // gdy rozegral mniej niz 100 parti i po dodaniu wczesniejszego turnieju ta liczba
  37. wciaz jest mniejsza niz 100
  38. // uwzglednia przypadek gdy gracz rozegral 97 partii i we wczesniejszym turnieju 4
  39. co razem daje 101
  40. // bez tego warunku skypt przeliczy zle ranking
  41.  $vSG = $vSG + $pers_dane[&#092;"Gry\"]; // zlicz ilosc rozegranych gier/partii
  42. $vskalpy = $vskalpy + $pers_dane[&#092;"Skalpy\"]; //zsumuj przyrosty rankingu
  43. }
  44. if ($vSG != 0) {$vRank = $vskalpy/$vSG;} // przeliczane rankingu
  45. }
  46. $vPID = $dane[&#092;"PID\"];
  47. $vName = $dane[&#092;"Name\"];
  48. }
  49. if ($dane[&#092;"SG\"] < 10) { //zaznaczenie ze gracz nalezy do poczekalni tzn rozegral mniej niz 10 partii w klu
  50. ie
  51. $color = '#FFDDBB'; // kolor tla wiersza
  52. $i++; // obliczanie miejsca zajmowanego w poczekalni
  53. $miejsce = '&raquo; '.$i;
  54. $class = 'tekstP'; // wybierz kolorowanie CSS dla poczelalni
  55. $aclass = 'txt2'; // wybierz kolorowanie CSS dla linkow w poczekalni
  56. }
  57. else {
  58. $color = '#DDBBAA'; // kolor tla wiersza
  59. $k++; //obliczanie miejsca zajmowanego w rankingu klubowym
  60. $miejsce = '&curren; '.$k;
  61. $class = 'tekst'; // wybierz kolorowanie CSS dla rankingu klubowego
  62. $aclass = ''; // wybierz kolorwoanie CSS dla linkow w rankingu klubowym
  63. }
  64. printf ('<tr style=\"background: '.$color.'\"><td class=\"'.$class.'\">'.$miejsce.'</td><td style=\"border-top 1pt solid black;\" class=\"'.$class.'\"><a href=\"gracze.php?SelGraczID='.$vPID.'\" class=\"'.$aclass.'\">'.$vName.'</a></td><td class=\"'.$class.'\">%.2f</td><td class=\"'.$class.'\">'.$vskalpy.'</td><td class=\"'.$class.'\">'.$vSG.'</td></tr>',$vRank);
  65. }
  66. ?>


Efekt zapytania (bez poprawek) mozna zobaczyc TUTAJ
po wybraniu z menu opcji rankingi
jak widac dla np 53 Turnieju dla osób na miejscu 5 i 8 liczba gier przekracza 100