![]() |
![]() ![]() |
![]() |
![]()
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ąć? |
|
|
![]()
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()
|
|
|
![]()
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%) ![]() ![]() |
powodzenia. -------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]()
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 |
|
|
![]()
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 ![]() -------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 25.04.2025 - 09:17 |