Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Pomoc w poprawie zapytania.
Forum PHP.pl > Forum > Przedszkole
Novy.
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.

Orzeszekk
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.
Novy.
dzięki za odpowiedz, pomógł poleciał wink.gif

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

może kiedyś przeskocze na obiektowe ;d
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.