Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zapytanie dla tabel w relacjach "wiele do wielu"
sonicius
post 5.11.2008, 22:49:54
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 1
Dołączył: 2.02.2006

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


Na początek spróbuje przedstawić uproszczoną wersje moich 3 tabel.


Osoba
---------------
osoba_id
imie
nazwisko

Osoba_has_pokoj
-----------------------------
osoba_id
pokoj_id

Pokoj
---------------
pokoj_id
nr_pokoju

Jest to baza osób z relacją wiele do wielu z tabelą pokoi. Każda osoba może posiadać wiele pokoi w których pracuje oraz pokoje mogą należeć do różnych osób, które w nich pracują.

Dla uproszczenia przykładu zakładam, że w bazie znajduje się jedna osoba o id=1 oraz dwa pokoje o id=1 oraz id=2

Czy jest jakaś możliwość, aby w jednym wierszu wybrać dane osoby (oczywiste) wraz ze wszystkimi pokojami jakie są do niej przypisane.

Chciałbym aby moja tabela wynikowa wyglądała tak:

Id osoby = 1 | Jan | Nowak | Pokoje do których jest przypisany: 234, 235
-------------------------------------------------------------------------------------
Id osoby = 2 | ...

Najbardziej narzucającym się dla mnie rozwiązaniem, jest stworzenie zapytania wybierającego podstawowe dane osoby, a później w pętli zagnieżdzonej, przy pomocy kolejnego zapytania (na podstawie id_osoby) wybierać do jakich pokoi jest przypisana. Jest to jednak bardzo wolne rozwiązanie i mam nadzieje, że da się to inaczej zrealizować w przypadku relacji wiele do wielu.

PS.
Próbowałem również wykorzystać możliwość jaką daję LEFT JOIN

SELECT o.*, p.nr_pokoju
FROM osoba o
LEFT JOIN osoba_has_pokoj ohp ON o.id=ohp.osoba_id
LEFT JOIN pokoj p ON ohp.pokoj_id=p.id

Wynikiem takiego zapytania (dla moich przykładowych danych) jest:


Id osoby = 1 | Jan | Nowak | Pokoje do których jest przypisany: 234
-------------------------------------------------------------------------------------
Id osoby = 1 | Jan | Nowak | Pokoje do których jest przypisany: 235

Czyli de fakto powielanie wierszy wynikowych (a chodzi mi o wynik w jednym wierszu, z dopisywaniem tylko kolejnych pokoi, do których przypisana jest osoba)

Jak można to najłatwiej i najefektywniej osiągnąć?
Go to the top of the page
+Quote Post
kitol
post 5.11.2008, 23:53:59
Post #2





Grupa: Zarejestrowani
Postów: 162
Pomógł: 26
Dołączył: 19.01.2007

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


poczytaj w manualu o GROUP BY i GROUP_CONCAT()
Go to the top of the page
+Quote Post
nevt
post 5.11.2008, 23:59:25
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


  1. SELECT osoba.*, GROUP_CONCAT(DISTINCT nr_pokoju ORDER BY nr_pokoju DESC SEPARATOR ', ') FROM osoba LEFT JOIN osoba_has_pokoj USING (osoba_id) LEFT JOIN pokoj USING (pokoj_id) GROUP BY osoba_id;

powodzenia.


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
sonicius
post 6.11.2008, 00:49:03
Post #4





Grupa: Zarejestrowani
Postów: 21
Pomógł: 1
Dołączył: 2.02.2006

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


Hmm

Okrojona wersja tego zapytania (SELECT * FROM osoba LEFT JOIN osoba_has_pokoj USING (osoba_id)) wyrzuca mi taki sam błąd.

#1054 - Unknown column 'osoba_id' in 'from clause'

Dla porównania zapytanie SELECT * FROM osoba LEFT JOIN osoba_has_pokoj ON (osoba_id) wykonuje się poprawnie.

Czym to jest spowodowane?

Użyłem mojej wcześniejszej struktury zapytania z 'ON' i działa jak należy. Serdeczne dzięki za pomoc
Go to the top of the page
+Quote Post
nevt
post 6.11.2008, 09:14:10
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


dlatego że w opisie tabeli podałeś że jest pole osoba_id:
Cytat
Osoba
---------------
osoba_id
imie
nazwisko

a tak naprawdę tam jest pole id (... ON o.id=ohp.osoba_id...)
stąd nieporozumienie - sam wprowadziłeś zamieszanie smile.gif


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post

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: 25.04.2025 - 09:17