Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL] Zapytanie SELECT pobierające dane z dwóch tabel
Kuba707
post
Post #1





Grupa: Zarejestrowani
Postów: 94
Pomógł: 0
Dołączył: 20.03.2010

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


Witam, mam problem z napisaniem zapytania. Mam sobie dwie tabele: `users` i `houses`.
Struktura `houses`:
Kod
hid - id rekordu
interior
entranceX
entranceY
entranceZ
exitX
exitY
exitZ
cost
owner - odpowiada id rekordu z tabeli `users`


Nie będę przedstawiał całej struktury tabeli `users`, ale indeksem jej jest pole o nazwie `uid`, a nazwa użytkownika to pole `nick`.
Teraz tak, potrzebuję napisać zapytanie, które pobierze WSZYSTKO z tabeli `houses`, ale dodatkowo ma pobrać nick użytkownika którego ID równe jest kolumnie owner z tabeli houses, czyli: houses.owner = users.uid. Możliwe jest, że houses.owner może przyjąć wartość 0, a nie mam użytkownika o takim id (liczenie zaczyna się od 1), wtedy tego nicku nie potrzebuję.

Oczywiście spróbowałem napisać zapytanie sam, ale nie wyszło mi. Oto one:
Kod
SELECT h.hid, h.interior, h.entranceX, h.entranceY, h.entranceZ, h.exitX, h.exitY, h.exitZ, h.cost, h.owner, users.nick AS nick FROM houses AS h, users WHERE users.uid=houses.owner

Kod
#1054 - Unknown column 'houses.owner' in 'where clause'


Nie jest zbytnio zaawansowany w SQL. Wiem jak stworzyć bazę, tabele, jakie dobrać typy pól :F, podstawowe zapytania, ale nie siedziałem w tym głębiej. Proszę o pomoc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
croc
post
Post #2





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

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


Zamiast 0 lepiej użyć NULL tam, gdzie nie ma właściciela. 0 też zadziała, ale NULL to naturalne rozwiązanie. Rozwiązanie kolegi kpt_lucek - pomijając fakt, że nie działa - jest niedobre. Generuje zbyt dużo zapytań i niewłaściwą strukturę wyniku.

Wypróbuj takie zapytanie:

  1. SELECT houses.*, users.nick AS nick
  2. FROM houses
  3. LEFT JOIN users ON users.uid = houses.owner


Kluczem do sukcesu jest tutaj LEFT JOIN, który w przypadku braku dopasowania ze strony dołączanej tabeli (users), mimo wszystko pobierze wiersz. Nick będzie miał wtedy wartość NULL.

Przy wyświetlaniu wyników zapytania możesz posłużyć się zwyczajnie pętlą:

  1. while($row = mysql_fetch_assoc($query)) {
  2. // UWAGA! $row['nick'] może zawierać wartość NULL, więc nie odwołuj się do tej wartości bez sprawdzenia - dobry przykład:
  3. echo array_key_exists ('nick', $row) ? $row['nick'] : 'brak';
  4. }
Go to the top of the page
+Quote Post

Posty w temacie


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: 11.10.2025 - 09:08