Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tabela rankingowa
Forum PHP.pl > Forum > PHP
kasior
Witajcie. Dawno nie pisałem, bo też dawno nie miałem jakiegoś problemu smile.gif
Zrobiłem apkę online do darta. Brakuje mi tylko tabli rankingowej i kurczę nie wiem zupełnie jak to ugryźć.

Dane w bazie zapisuję tak:



Chciałbym uzyskać tabelkę mniej więcej taką:

Gracz | Mecze | Wygrane | Legi wygrane | Srednia average | Max
-----------------------------------------------------------------------------------

Pomożecie?
maly_swd
Pomożemy.
Pokaż co zrobiłeś do tej pory:)
kasior
Ok. Z php na razie nic nie robiłem, wyświetlanie na potem ale zacząłbym od pobrania graczy. Potem pętla po kolei dla kazdego gracza:

(i tu sie zaczynają moje wypociny)
przykładowo umiesciłem gracza o ID 5, bo nie mamy tu pętli przeciez.

  1. SELECT *,name,team,id_player,SUM(ilosc) AS ilosc_meczow,SUM(average3) AS srednia FROM (
  2. SELECT count(id_match) AS ilosc, SUM(average1) AS average3 FROM dt_matches b WHERE player1 = 5
  3. UNION
  4. SELECT count(id_match) AS ilosc, SUM(average2) AS average3 FROM dt_matches c WHERE player2 = 5
  5. )
  6. ranking
  7. LEFT JOIN dt_players AS players ON players.id_player = 5


I tu mam już kilka danych które mogę wyświetlić lub wykorzystać do przeliczenia innych

name | team | id_player | ilosc_meczow | srednia
Jan | BG | 5 | 8 | 268



Działając dalej kombinowałem na dwa sposoby, ale nie wiem czy w ogóle dobra droga podążam:

  1. SELECT name,team,id_player,SUM(ilosc) AS ilosc_meczow,SUM(average3) AS srednia,SUM(wygrane) AS wygrane_mecze FROM (
  2. SELECT count(id_match) AS ilosc, SUM(average1) AS average3 FROM dt_matches
  3. LEFT JOIN(SELECT count(id_match) AS wygrane FROM dt_matches WHERE score1 = legs AND player1 = 5) AS nn ON player1 = 5 WHERE player1 = 5
  4. UNION
  5. SELECT count(id_match) AS ilosc, SUM(average2) AS average3 FROM dt_matches
  6. LEFT JOIN(SELECT count(id_match) AS wygrane FROM dt_matches WHERE score2 = legs AND player2 = 5) AS nn ON player2 = 5 WHERE player2 = 5
  7. )
  8. ranking
  9. LEFT JOIN dt_players AS players ON players.id_player = 5


lub

  1. SELECT name,team,id_player,SUM(ilosc) AS ilosc_meczow,SUM(average3) AS srednia,SUM(wygrane) AS wygrane_mecze FROM (
  2. SELECT count(id_match) AS ilosc, SUM(average1) AS average3 FROM dt_matches WHERE player1 = 5
  3. UNION
  4. SELECT count(id_match) AS ilosc, SUM(average2) AS average3 FROM dt_matches WHERE player2 = 5
  5. UNION
  6. SELECT count(id_match) AS wygrane, SUM(legs) AS legi FROM dt_matches WHERE player1 = 5 AND legs = score1
  7. UNION
  8. SELECT count(id_match) AS wygrane, SUM(legs) AS legi FROM dt_matches WHERE player2 = 5 AND legs = score2
  9. )
  10. ranking
  11. LEFT JOIN dt_players AS players ON players.id_player = 5



W obydwu powyższych otrzymuję wynik

#1054 - Nieznana kolumna 'wygrane' w field list

To na razie tyle co zrobiłem w temacie rankingu.
sazian
Wykonaj sobie same podzapytania to zobaczysz o co chodzi z komunikatem błędu
kasior
No jakoś nic nie zobaczyłem. Podzapytania wykonują się poprawnie, otrzymuję kolumnę wygrane więc questionmark.gif?
nospor
Zrozum, odwolujesz sie do kolumny "wygrane", ktora nie istnieje w podzapytaniu. Raz w union sie ona nazywa "ilosc" a raz "wygrane". Dobrze by bylo, by zakazdym razem nazywalo sie tak samo. Wiec jak jedno zapytanie zwraca ci ilosc, to musisz stworzyc wirtualna kolumne z wartoscia NULL o nazwie wygrane, i viceversa. Jak zapytanie zwraca ci wygrane, to masz stworzyc wirtualne ilosc z wartoscia NULL. I pamietaj by kolejnosc byla zawsze ta sama
kasior
Witaj nospor, zawsze się pojawiasz jak mam problem smile.gif
No dobrze, zakładając,ze masz rację to czemu zmieniając count(id_match) na np count(legs) (bo chodzi przecież o zliczenie rekordów w dalszym ciągu jest komunikat o nieznanej kolumnie wygrane??

  1. SELECT name,team,id_player,SUM(ilosc) AS ilosc_meczow,SUM(average3) AS srednia,SUM(wygrane) AS wygrane_mecze FROM (
  2. SELECT count(id_match) AS ilosc, SUM(average1) AS average3 FROM dt_matches
  3. LEFT JOIN(SELECT count(legs) AS wygrane FROM dt_matches WHERE score1 = legs AND player1 = 5) AS nn ON player1 = 5 WHERE player1 = 5
  4. UNION
  5. SELECT count(id_match) AS ilosc, SUM(average2) AS average3 FROM dt_matches
  6. LEFT JOIN(SELECT count(legs) AS wygrane FROM dt_matches WHERE score2 = legs AND player2 = 5) AS nn ON player2 = 5 WHERE player2 = 5
  7. )
  8. ranking
  9. LEFT JOIN dt_players AS players ON players.id_player = 5


Nie można używać dwa razy count w zapytaniu??

A w ogóle nie napisał nikt czy w dobrą stronę zmierzam bo może zupełnie inaczej się powinno podejść do tego.
nospor
Twoje podzapytania dalej nie zwracaja kolumny wygrane. Komunikat wyraznie ci o tym mowi. ja ci wyraznie o tym mowie, a ty ciagle zdziwiony ze nie ma wygrane
kasior
Dalej nie rozumiem co mi chcecie powiedzieć smile.gif

Rozwiązałem to następująco: (zapodaję całe kody)

  1. $sql = 'select id_player from dt_players';
  2. $stmt = $hDB->prepare($sql);
  3. $stmt->execute();
  4. $num = $stmt->rowCount();
  5.  
  6. if ($num>0){
  7. $player = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  8. for ($i=0;$i<$num;$i++){
  9. $player= $stmt->fetch();
  10. $players[] = $player;
  11. $gracz_ids[$i] = $players[$i]['id_player'];
  12. }
  13. }
  14. //$smarty->assign('players',$players);
  15. //debug($players);
  16.  
  17.  
  18. foreach ($gracz_ids as $gracze) {
  19.  
  20.  
  21. $sql = 'SELECT id_player,name,team, SUM(ilosc) as ilosc_meczow, wygrane1+wygrane2 as mecze_wygrane, SUM(average3)/SUM(ilosc) as srednia_na_mecz, SUM(ilosc)/(wygrane1+wygrane2) as skut FROM (
  22. select count(id_match) as ilosc, SUM(average1) as average3 from dt_matches where player1 = '.$gracze["id_player"]. '
  23. UNION
  24. select count(id_match) as ilosc, SUM(average2) as average3 from dt_matches where player2 = '.$gracze["id_player"].'
  25. )
  26. ranking
  27. LEFT JOIN dt_players AS players ON players.id_player = '.$gracze["id_player"].'
  28. LEFT JOIN(select count(id_match) as wygrane1 from dt_matches where score1 = legs and player1 = '.$gracze["id_player"].') AS playersa ON players.id_player = '.$gracze["id_player"].'
  29. LEFT JOIN(select count(id_match) as wygrane2 from dt_matches where score2 = legs and player2 = '.$gracze["id_player"].') AS playersb ON players.id_player = '.$gracze["id_player"].'
  30. order by skut asc
  31. ';
  32.  
  33. $stmt = $hDB->prepare($sql);
  34. $stmt->execute();
  35. $num = $stmt->rowCount();
  36.  
  37. if ($num>0){
  38. $gracz1 = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  39. for ($i=0;$i<$num;$i++){
  40. $gracz1= $stmt->fetch();
  41. $gracze1[] = $gracz1;
  42. $gracze1[$gracz1['id_category']][] = $gracz1;
  43.  
  44. }
  45. }
  46. $smarty->assign('players',$gracze1);
  47. //debug($gracz1);
  48.  
  49. }
  50.  
  51.  
  52. ?>



  1. <table width="90%" border="0" cellspacing="10" cellpadding="10">
  2. <tr>
  3. <th align="left" scope="col"> </th>
  4. <th align="left" scope="col">Team</th>
  5.  
  6. <th align="left" scope="col">Ilość meczów / skut</th>
  7. <th align="left" scope="col">Ilość
  8. wygranych</th>
  9. <th align="left" scope="col">Średnia
  10. 3 dart</th>
  11. <th align="left" scope="col">Średnia
  12. 1 dart</th>
  13. <th align="left" scope="col">Max</th>
  14. </tr>
  15.  
  16. {section start=0 step=1 name=g loop=$players"}
  17. {if $players[g].name}
  18. <tr>
  19. <th align="left" scope="row">{$players[g].name}</th>
  20. <td align="left">{$players[g].team}</td>
  21.  
  22. <td align="left">{$players[g].ilosc_meczow} | {$players[g].skut}</td>
  23. <td align="left">{$players[g].mecze_wygrane}</td>
  24. <td align="left">{$players[g].srednia_na_mecz|round:0}</td>
  25. <td align="left">{$players[g].srednia_na_mecz/3|round:0}</td>
  26. <td align="left"></td>
  27. </tr>
  28. {/if}
  29. {/section}



Wynik:
Gracz | Team | Ilość meczów | skut | Ilość wygranych | 3 dart | 1 dart
g1 | DT | 9 | 2.2500 | 4 | 32 | 11
g2 | DT | 7 | 1.7500 | 4 | 43 | 14
g3 | DT | 8 | 2.0000 | 4 | 34 | 11
g4 | DT | 4 | 4.0000 |1 | 29 | 10
g5 | DT | 1 | 0 | 21 | 7
g6 | DT | 1 | 0 | 14 | 5




Ponieważ nie wiedziałem jak sobie to posortować żeby ranking był rankingiem dodałem pole skut które sortowane od najniższej do największej wartości da nam ranking w kolejności, jednakże to sortowanie nie działa.
Być moze da się to wszystko prościej zrobić - ja nie potrafię póki co....

Dopiszę, żeby zakończyć temat że sortowanie opanowane za pomoca funkcji:

  1. function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) {
  2. $sort_col = array();
  3. foreach ($arr as $key=> $row) {
  4. $sort_col[$key] = $row[$col];
  5. }
  6.  
  7. array_multisort($sort_col, $dir, $arr);
  8. }

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.