Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MYSQL]Zsumowanie 2 rekordów i wypisanie posortowanych wyników
grzegosh
post
Post #1





Grupa: Zarejestrowani
Postów: 51
Pomógł: 3
Dołączył: 26.06.2008

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


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ę.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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





Grupa: Zarejestrowani
Postów: 51
Pomógł: 3
Dołączył: 26.06.2008

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


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ć... (IMG:http://forum.php.pl/style_emoticons/default/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.

Ten post edytował grzegosh 15.07.2009, 22:36:50
Go to the top of the page
+Quote Post
Wicepsik
post
Post #4





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


  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


Ten post edytował Wicepsik 16.07.2009, 10:24:33
Go to the top of the page
+Quote Post
grzegosh
post
Post #5





Grupa: Zarejestrowani
Postów: 51
Pomógł: 3
Dołączył: 26.06.2008

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


Dzięki, działa (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Nie byłem daleko jednak (IMG:http://forum.php.pl/style_emoticons/default/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?

Ten post edytował grzegosh 16.07.2009, 19:02:33
Go to the top of the page
+Quote Post
erix
post
Post #6





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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





Grupa: Zarejestrowani
Postów: 51
Pomógł: 3
Dołączył: 26.06.2008

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


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





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Ale zrobiłeś, jak pisaliśmy...?
Go to the top of the page
+Quote Post
grzegosh
post
Post #9





Grupa: Zarejestrowani
Postów: 51
Pomógł: 3
Dołączył: 26.06.2008

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


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





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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





Grupa: Zarejestrowani
Postów: 51
Pomógł: 3
Dołączył: 26.06.2008

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


No, teraz działa już na pewno, dzięki wielkie (IMG:http://forum.php.pl/style_emoticons/default/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?
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: 23.08.2025 - 08:20