Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Zsumowanie 2 rekordów i wypisanie posortowanych wyników
Forum PHP.pl > Forum > Przedszkole
grzegosh
Witam.
Dla treningu piszę swoją prostą gierkę internetową.
Mam w bazie różne dane o postaci, tworze sortowanie wyświetlania wyników po róznych polach, np po nicku alfabetycznie, ilości wygranych walk itp.
Chciałbym też zrobic sortowanie po sumie walk, czyli po wszystkich stoczonych walkach.
Mam w bazie pola wins oraz loses. Sortowanie po największej licznie wygranych jest proste, ale jak zrobic sortowanie po ilosci walk (czyli sumie wygranych i przegranych)?

Drugie pytanie: jak zrobić najlepiej, że po kliknieciu na sortowanie wg np nicku, jak kliknę raz to sortuje ASC, jak drugi raz to DESC? Myślałem o przekazywaniu getem sposobu sortowania np:
sort=nick&sposob=asc
Czy to dobre rozwiązanie? Jest jakieś lepsze?
Dziękuję.
erix
Cytat
Sortowanie po największej licznie wygranych jest proste, ale jak zrobic sortowanie po ilosci walk (czyli sumie wygranych i przegranych)?

Jako pole wybierasz sumę kolumn (używasz aliasu dla wyniku) i wg niego sortujesz.
grzegosh
Przepraszam, niestety nie rozumiem. Albo może źle wytłumaczyłem.
Mam w tabeli kolumny wins, loses, które trzymają wartości dla każdego użytkownika.
Jak w SELECT zsumować wartości np jak ktoś ma 4 wygrane i 3 przegrane to razem 7, nikt nie ma większej sumy więc ten ktoś ląduje na górze.
Wydaje mi się, że SUM() to nie tutaj (może się mylę), ale próbowałem i tak i nie wychodzi.
$query = mysql_query("SELECT SUM(wins + loses) as fights FROM characters ORDER BY fights ASC");

$query = mysql_query("SELECT (wins + loses) as fights FROM characters ORDER BY fights ASC");
też nie działa

Wiem, że to proste, ale nie denerwujcie się jesli mogę prosić... smile.gif

Edit:
Z tym 2 problemem poradziłem sobie tak:
  1. <?php
  2. $by = '';
  3.  
  4. switch($_GET['sort']
  5. {
  6.    case 'wins':
  7.        if($_GET['by']=='z')
  8.        {
  9.            $by = '&by=a';
  10.            $query = mysql_query("SELECT * FROM characters ORDER BY wins ASC, login ASC");
  11.        }
  12.        else
  13.        {
  14.            $by = '&by=z';
  15.            $query = mysql_query("SELECT * FROM characters ORDER BY wins DESC, login ASC");
  16.        }
  17.        break;
  18.        
  19.    case 'loses':
  20.        if($_GET['by']=='z')
  21.        {
  22.            $by = '&by=a';
  23.            $query = mysql_query("SELECT * FROM characters ORDER BY loses ASC, login ASC");
  24.        }
  25.        else
  26.        {
  27.            $by = '&by=z';
  28.            $query = mysql_query("SELECT * FROM characters ORDER BY loses DESC, login ASC");
  29.        }
  30.        break;
  31. }
  32.  
  33. (...)
  34. A PONIŻEJ:
  35.  
  36. echo "<td><b><a href='?cont=rank&sort=wins".$by."'>Wygranych</a></b></td><td><b><a href='?cont=rank&sort=loses".$by."'>Przegranych</a></b></td>";
  37. ?>


Nie jest to za dobre rozwiązanie, zna ktoś lepsze? Dziękuje.
Wicepsik
  1. SELECT (
  2. SUM( wins ) + SUM( loses )
  3. ) AS fights
  4. FROM characters ORDER BY fights ASC



A co do tego. Lepiej pobierać tylko wygrane, bądź przegrane niż wszystko

  1. SELECT wins, login FROM characters ORDER BY wins ASC, login ASC
grzegosh
Dzięki, działa smile.gif Nie byłem daleko jednak smile.gif

A czy ten sposób sortowania jak sie kliknie 2 raz na dany link to sortuje DESC, jak sie kliknie znow to ASC? Mój działa, jest w porządku, prócz tego, że jak ktoś kliknie na jakieś sortownie, potem ustawi zmienną na sortowanie DESC i jak kliknę na inny link sortujący to on posortuje wg DESC bo pobierze z GET'a... Jest lepsza metoda?

Edit: a nie, przepraszam, jednak nie działa to poprawnie... Nie wyświetla mi w ogole sum tych walk... ;/ może dam cały kod, coś pomoże nie wiem. W dodatku wypisuje wiecej danych niż tylko te walki, wiec musze wybrać z bazy wiecej.

  1. <?php
  2. $by = '';
  3. switch($_GET['sort'])
  4. {
  5.    case 'lvl':
  6.        if($_GET['by']=='z')
  7.        {
  8.            $by = '&by=a';
  9.            $query = mysql_query("SELECT * FROM characters ORDER BY lvl ASC, login ASC");
  10.        }
  11.        else
  12.        {
  13.            $by = '&by=z';
  14.            $query = mysql_query("SELECT * FROM characters ORDER BY lvl DESC, login ASC");
  15.        }
  16.        break;
  17.            
  18.    case 'fights':
  19.        
  20.        if($_GET['by']=='z')
  21.        {
  22.            $by = '&by=a';
  23.            $query = mysql_query("SELECT (SUM( wins ) + SUM( loses )) AS fights FROM characters ORDER BY fights ASC, login ASC");
  24.        }
  25.        else
  26.        {
  27.            $by = '&by=z';
  28.            $query = mysql_query("SELECT (SUM( wins ) + SUM( loses )) AS fights FROM characters ORDER BY fights DESC, login ASC");
  29.        }
  30.        break;
  31.        
  32.    case 'wins':
  33.        if($_GET['by']=='z')
  34.        {
  35.            $by = '&by=a';
  36.            $query = mysql_query("SELECT * FROM characters ORDER BY wins ASC, login ASC");
  37.        }
  38.        else
  39.        {
  40.            $by = '&by=z';
  41.            $query = mysql_query("SELECT * FROM characters ORDER BY wins DESC, login ASC");
  42.        }
  43.        break;
  44.        
  45.    case 'loses':
  46.        if($_GET['by']=='z')
  47.        {
  48.            $by = '&by=a';
  49.            $query = mysql_query("SELECT * FROM characters ORDER BY loses ASC, login ASC");
  50.        }
  51.        else
  52.        {
  53.            $by = '&by=z';
  54.            $query = mysql_query("SELECT * FROM characters ORDER BY loses DESC, login ASC");
  55.        }
  56.        break;
  57.        
  58.    default:
  59.        if($_GET['by']=='z')
  60.        {
  61.            $by = '&by=a';
  62.            $query = mysql_query("SELECT * FROM characters ORDER BY login DESC");
  63.        }
  64.        else
  65.        {
  66.            $by = '&by=z';
  67.            $query = mysql_query("SELECT * FROM characters ORDER BY login ASC");
  68.        }
  69.        break;
  70. }
  71.  
  72. $i=1;
  73. echo "<div class='rank_div'>";
  74. echo "<table border='1' class='rank_table'>";
  75. echo "<tr><td><b>Pozycja</b></td><td><b><a href='?cont=rank".$by."'>Nazwa postaci</a></b></td><td><b><a href='?cont=rank&sort=lvl".$by."'>Poziom</a></b></td><td><b><a href='?cont=rank&sort=fights".$by."'>Stoczonych walk</a></b></td><td><b><a href='?cont=rank&sort=wins".$by."'>Wygranych</a></b></td><td><b><a href='?cont=rank&sort=loses".$by."'>Przegranych</a></b></td>";
  76. while($char = mysql_fetch_array($query))
  77. {
  78.    echo "<tr><td>".$i."</td>";
  79.    echo "<td>".$char['login']."</td>";
  80.    echo "<td>".$char['lvl']."</td>";
  81.    $fights = $char['wins']+$char['loses'];
  82.    echo "<td>".$fights."</td>";
  83.    echo "<td>".$char['wins']."</td>";
  84.    echo "<td>".$char['loses']."</td></tr>";
  85.    $i++;
  86. }
  87. echo "</table>";
  88. echo "</div>";
  89. ?>


Przepraszam, że się tak pospieszyłem :/

Przepraszam, że piszę posta pod postem, ale temat zaginął, a nie chciałbym tworzyć nowego...
Czy jest możliwe w ogole takie coś co chce osiągnąć? Czy muszę tworzyć w bazie nową kolumnę z wszystkimi walkami?
erix
Cytat
Przepraszam, że piszę posta pod postem, ale temat zaginął, a nie chciałbym tworzyć nowego...
Czy jest możliwe w ogole takie coś co chce osiągnąć?

To znaczy? Wal konkretnie.
grzegosh
Tzn, dalej ten sam problem.
W bazie jest tabela characters, w niej informacje o postaci, a w śród tych informacji kolumny wins i loses. Kod zamieszczony wyżej wyświetla mi tabelę, taki jakby ranking użytkowników. Zrobiłem sobie sortowanie informacji np po nicku alfabetycznie, po ilości wygranych walk, ale nie wiem jak zrobić sortowanie po ilości stoczonych walk (czyli walki wygrane + przegrane). Tej informacji w bazie nie mam. Zatem, jak posortować od najwiekszej liczby "ilość walk stoczonych"?
Jest jakiś prosty sposób, czy pozostaje mi tylko sortowanie ręcznie jakąś funkcją, albo kolejna kolumna w bazie? :/

Dzięki erix.
erix
Ale zrobiłeś, jak pisaliśmy...?
grzegosh
No tak, ale nic się nie wyświetla, jedno zero. Możliwe, że to działa, ale nie wiem jak potem wypisać te wszystkie informacje z bazy, skoro wybieram tylko wins + loses. Robiłem:
$query = mysql_query("SELECT (SUM( wins ) + SUM( loses )) AS fights, lvl, wins, loses, login FROM characters ORDER BY fights ASC, login ASC");
ale to tez nic nie daje, a nawet wywala bład.
Zdaje mi się, że w ogole to nie działa.
erix
Nie:
  1. SELECT (SUM( wins ) + SUM( loses )) AS fights

a:
  1. SELECT wins+loses AS fights

Bo SUM liczy sumę we wszystkich rekordach. A wywala błąd, bo SUM jest funkcją agregującą, która działa wyłącznie z GROUP BY.
grzegosh
No, teraz działa już na pewno, dzięki wielkie smile.gif.
Jeszcze mam pytanie, odnosnie tego sortowania po kliknieciu ASC lub DESC, jest jakiś lepszy sposób niż ten który zrobiłem i wkleiłem wyżej?
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.