![]() |
![]() ![]() |
![]() |
![]()
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. |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 1 495 Pomógł: 245 Dołączył: 1.07.2009 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 428 Pomógł: 77 Dołączył: 10.07.2011 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
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 |
|
|
![]()
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:
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ą:
|
|
|
![]()
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)
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 17.09.2025 - 19:37 |