Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL]Zsumowanie 2 rekordów i wypisanie posortowanych wyników
grzegosh
post 15.07.2009, 21:51:13
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
erix
post 15.07.2009, 22:01:11
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.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
grzegosh
post 15.07.2009, 22:17:13
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ć... 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 16.07.2009, 10:22:03
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 17.07.2009, 21:50:57
Post #5





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

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


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?

Ten post edytował grzegosh 16.07.2009, 19:02:33
Go to the top of the page
+Quote Post
erix
post 17.07.2009, 23:03:07
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.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
grzegosh
post 17.07.2009, 23:39:48
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 18.07.2009, 11:18:31
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...?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
grzegosh
post 18.07.2009, 11:48:14
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 18.07.2009, 11:59:41
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.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
grzegosh
post 18.07.2009, 12:14:54
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 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 Wersja Lo-Fi Aktualny czas: 16.07.2025 - 20:47