Łączenie 3 tabel z bazy danych w mysql

Odpowiedz Nowy wątek
2014-11-04 01:04
nowy12345
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.

Pozostało 580 znaków

2014-11-04 08:00
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.


"There are people who actually like programming. I don't understand why they like programming."
Rasmus Lerdorf

Pozostało 580 znaków

2014-11-04 20:10
nowy12345
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.

Pozostało 580 znaków

2014-11-04 21:48
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.


"There are people who actually like programming. I don't understand why they like programming."
Rasmus Lerdorf
edytowany 2x, ostatnio: Vardamir, 2014-11-04 21:51

Pozostało 580 znaków

2014-11-17 22:24
nowy12345
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).

Pozostało 580 znaków

2014-11-18 16:46
Biały Kruk
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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