Łączenie 3 tabel z bazy danych w mysql

0

Witam,
mam problem z pobraniem danych z bazy w konkretnej kolejności. Zacznę od bazy:

Opisy zdjęć

image_id desc
1 Obrazek 1
2 Obrazek 2
3 Obrazek 3

Zdjęcia

image_id url
1 1.jpg
2 2.jpg
3 3.jpg

Jaki produkt ma jakie zdjęcia

product_id image_id url sequence
1 1 1.jpg 3
1 2 2.jpg 2
1 3 3.jpg 1

I teraz chcę pobrać dane w taki sposób, że pobieram zdjęcia i ich opisy tego produktu, którego podałem numer ID
Wykonałem coś takiego:

SELECT * FROM zdjecia AS Z LEFT JOIN opisy AS O ON Z.image_id = O.image_id WHERE O.image_id IN (SELECT image_id FROM produkty)

I teraz w jaki sposób nadać kolejność sequence? - jestem w kropce i proszę o pomoc.

0

Ale dlaczego w tej ostatniej tabeli (Jaki produkt ma jakie zdjęcia) przechowujesz URL ? Przecież od tego masz tabelkę Zdjęcia, która de facto mogłaby zawierać zarówno URL i opis.

Pomijając to, zacznij właśnie od tej ostatniej tabeli i do niej wykonaj dwa joiny z tabelami Zdjęcia i Opisy Zdjęć. Dzięki temu będziesz mógł bez podzapytania podać id_produktu i dostaniesz informację o sequence.

0

Kopiowałem tabelki i nie zauważyłem :) Oczywiście, że nie ma tam url.

A co do zapytania to robiłem to na joinach, ale nie pobiera tego tak jak chcę.

SELECT * FROM 
			produkty AS P 
 				INNER JOIN (zdjecia AS Z LEFT JOIN opisy AS O ON Z.image_id = O.image_id) 
			ON P.image_id = Z.image_id 
		WHERE P.product_id = '1' ORDER BY P.sequence

Tylko to ma jeden minus. Jak tablice nie będą miały wszystkich pół to wyświetli mi tylko część wyników. Przykład:

Opisy zdjęć

image_id desc
1 Obrazek 1
2 Obrazek 2

Zdjęcia

image_id url
1 1.jpg
2 2.jpg
3 3.jpg

Produkty

product_id image_id sequence
1 1 5
1 2 4
1 3 3
1 4 2
1 5 1

To wyświetli mi tylko 2 rekordy (dla image_id 1 i 2). A ja chcę by pobierał wszystko, ale w mysql nie ma FULL JOIN.

1

Nie rozumiem sensu tych nawiasów we FROM. Wszystko czy tylko to, gdzie istnieje url?

FULL JOIN nie ma, ale są złączenia zewnętrzne. Tutaj musi istnieć url:

SELECT * FROM produkty AS P 
INNER JOIN zdjecia AS Z ON P.image_id = Z.image_id 
LEFT OUTER JOIN opisy AS O ON P.image_id = O.image_id 
WHERE P.product_id = '1' ORDER BY P.sequence

Jeśli chcesz wszystkie rekordy z tabeli produkty to pierwsze złączenie też musi być LEFT OUTER.

0

Wracam do tematu jeszcze raz:

Buduję wszystko tak jak tutaj i nie działa mi LEFT OUTER tak jak chce. Chcę by pobierane były dane nie zważając na to czy Opis istnieje czy nie. W tej formie jak mam pusty rekord w opisie to nie pobiera mi tego "zapytania" (w sensie rekordu).

0

Spróbuj po prostu:

SELECT
		p.image_id
		,z.url
		,o.desc
		,p.sequence
FROM
		produkty p with(nolock)
		left join zdjecia z with(nolock) on p.image_id=z.image_id
		left join opisy o with(nolock) on p.image_id=o.image_id
WHERE	
		p.productid=123
ORDER BY
		p.sequence

1 użytkowników online, w tym zalogowanych: 0, gości: 1