Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Pomoc w poprawie zapytania.
Novy.
post 3.03.2012, 00:33:08
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
 
Start new topic
Odpowiedzi
Orzeszekk
post 3.03.2012, 01:00:56
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


--------------------
"The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs
Go to the top of the page
+Quote Post

Posty w temacie


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: 14.08.2025 - 16:27