Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [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
sadistic_son
post
Post #2





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


  1. WHERE h.owner=users.uid
W matematyce czy fizyce = jest naprzemienne ; w programowaniu nie.

Ten post edytował sadistic_son 14.10.2011, 23:52:59
Go to the top of the page
+Quote Post
kpt_lucek
post
Post #3





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

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


  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. ?>
Go to the top of the page
+Quote Post
Kuba707
post
Post #4





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

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


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 (IMG:style_emoticons/default/tongue.gif)

Ten post edytował Kuba707 15.10.2011, 00:32:27
Go to the top of the page
+Quote Post
croc
post
Post #5





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
Kuba707
post
Post #6





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

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


Działa. O coś takiego mi chodziło. Dzięki (IMG:style_emoticons/default/smile.gif)
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: 17.09.2025 - 19:37