Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Pomoc w poprawie zapytania.
Novy.
post
Post #1





Grupa: Zarejestrowani
Postów: 50
Pomógł: 8
Dołączył: 28.10.2011

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


Pisze grę przeglądarkową, przyszedł czas na ranking graczy. I mam problem. Może najpierw kod:

  1. <?php
  2. include("header.php");
  3.  
  4. $query = mysql_query('SELECT g.nazwa, p.id, p.login, p.level, p.gold, p.guild, p.win, p.lose FROM guilds g LEFT JOIN players p ON (p.guild = g.id) ORDER BY p.level DESC LIMIT 10');
  5. echo '<table border="0" align="center" style="text-align:center;">
  6. <tr>
  7. <td width="70">Miejsce</td>
  8. <td width="70">Nick</td>
  9. <td width="90">Level</td>
  10. <td width="80">Złoto</td>
  11. <td width="70">Zwycięstwa</td>
  12. <td width="70">Porażki</td>
  13. <td width="70">Gildia</td>
  14. </tr>';
  15. $i = 1;
  16. while($tablica = mysql_fetch_array($query))
  17. {
  18. echo '<tr>
  19. <td width="70">'.$i.'.</td>
  20. <td width="70">'.$tablica['login'].'</td>
  21. <td width="90">'.$tablica['level'].'</td>
  22. <td width="80">'.$tablica['gold'].'</td>
  23. <td width="70">'.$tablica['win'].'</td>
  24. <td width="70">'.$tablica['lose'].'</td>
  25. <td width="70">'.$tablica['nazwa'].'</td>
  26. </tr>';
  27. $i++;
  28. }
  29. echo '</table>';
  30. include("footer.php");
  31. ?>


Wszystko działa kiedy gracz ma gildie, a kiedy nie ma to po prostu nie wyświetla linijki o graczu.

  1. p.guild = g.id


czyli w polu guild w tabeli players wpisane jest id gildii, a w tabeli guilds istnieje gildia o takim id, więc wszystko działa.

Kiedy ktoś nie ma gildii w polu guild wpisane jest 0, a w tabeli guilds nie ma gildii o id 0.

Jak to ominąć? Zaglądałem do manuala Mysqla, kombinowałem, ale nic mi z tego nie przyszło.

Go to the top of the page
+Quote Post
Orzeszekk
post
Post #2





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

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


Wywal joina, zrób 2 oddzielne zapytania. najpierw pytasz sie o playera, a następnie, w drugim zapytaniu robisz zapytanie o jego gildie w stylu:
  1. SELECT * FROM guilds WHERE guild_id = $guildID
, $guildID bierzesz z poprzedniego zapytania z tabeli players.

Jeżeli będzie zero to nic nie zwroci - ewentualnie mozesz dodac warunek ze zapytanie sie wykona tylko jak $guildID != 0.

Wiesz, nie chce cie wprowadzic w błąd, olałem 90% wykladow z Inzynierii Oprogramowania i 50% laborek, jednakże wydaje mi sie że Join służy do łączenia tabel ktore są połączone relacją 1:1 (czyli jeden wiersz w tabeli jednej odpowiada dokladnie jednemu w tabeli drugiej).
U ciebie czesc graczy nie nalezy do zadnej gildii wiec relacja 1:1 nie zachodzi (scislej jest to relacja 1:n - wiele graczy moze na raz nalezec do jednej gildii, ale kazdy gracz moze miec tylko jedna gildie).

Jesli chcesz pisac duze aplikacje, moze zainteresuj sie programowaniem obiektowym i odwzorowaniem bazy danych na obiekty (ORM), np Doctrine2? bedzie ci duzo latwiej ogarnąć złożoność. Nie widze u ciebie zadnych modeli, widokow, zapewne będziesz w wielu miejscach robił copy&paste przez to, a nastepnie bedziesz poprawial wiele razy te same błędy w roznych miejscach.

Ten post edytował Orzeszekk 3.03.2012, 01:01:58
Go to the top of the page
+Quote Post
Novy.
post
Post #3





Grupa: Zarejestrowani
Postów: 50
Pomógł: 8
Dołączył: 28.10.2011

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


dzięki za odpowiedz, pomógł poleciał (IMG:style_emoticons/default/wink.gif)

co do programowania obiektowego - na razie zostane przy struktularnym - jest dla mnie wygodniejsze i czytelniejsze.

może kiedyś przeskocze na obiektowe ;d
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 11:35