Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Zapytanie SELECT pobierające dane z dwóch tabel
Forum PHP.pl > Forum > Przedszkole
Kuba707
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.
sadistic_son
  1. WHERE h.owner=users.uid
W matematyce czy fizyce = jest naprzemienne ; w programowaniu nie.
kpt_lucek
  1. <?
  2. $sql = mysql_query("SELECT * FROM `houses`");
  3. while($row = mysql_fetch_array($sql, MYSQL_ASSOC))
  4. {
  5. $sql2 = mysql_query("SELECT * FROM `nazwa 2giej tabeli` WHERE `users.uid` = '$row[houses.owner]'");
  6. while($row2 = mysql_fetch_array($sql2, MYSQL_ASSOC))
  7. {
  8. echo $row2[users.uid]."<br>\n";
  9. }
  10. }
  11.  
  12. ?>
Kuba707
Ok, dzięki Wam za pomoc.

Poprawny kod
Kod
SELECT h . * , users.nick AS nick
FROM houses AS h, users
WHERE users.uid = h.owner

Błąd był w tym, że w ostatniej linii było
Kod
WHERE users.uid = houses.owner
i nie rozpoznawało tej tabeli ponieważ w zapytaniu używałem skrótu dla nazwy tej tabeli.

EDIT:
Cholera, jednak nie jest dobrze...
Zobaczcie na screena klik.
W tabeli `houses` mam trzy rekordy. Dwa domy mają przypisanego właściciela, trzeci nie ma (owner=0 -> w tabeli users id zaczyna się od 1). Chcę pobrać wszystkie rekordy z `houses` i jeśli dom ma właściciela to chce też nick właściciela. Jednak mój kod pobiera tylko domy, które mają właściciela.
Edit 2: Najprościej mógłbym do tabeli `users` dodać usera bez nicku, jednak to że tak powiem frajerskie rozwiązanie tongue.gif
croc
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. }
Kuba707
Działa. O coś takiego mi chodziło. Dzięki smile.gif
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.