2012-08-27 17 views
11

mam te cztery tabele:Wewnętrzna dołączyć do wielu tabel

PRODUCTS 
--------- 
PRODUCT_ID 
PRODUCT_TITLE 
(other fields) 

COLORS 
--------- 
COLOR_ID 
COLOR_NAME 

MATERIALS 
--------- 
MATERIAL_ID 
MATERIAL_NAME 

IMAGES 
--------- 
IMAGE_ID 
BIG 
MED 
SMALL 
THUMB 

SIZE 
--------- 
SIZE_ID 
SIZE_NAME 

a ponadto:

PRODUCT_COLOR 
--------- 
PRODUCT_ID 
COLOR_ID 

PRODUCT_MATERIAL 
--------- 
PRODUCT_ID 
MATERIAL_ID 

PRODUCT_SIZE 
--------- 
PRODUCT_ID 
SIZE_ID 

PRODUCT_IMAGE 
--------- 
PRODUCT_ID 
IMAGE_ID 
COLOR_ID (can be null) 
MATERIAL_ID (can be null) 

Wszystkie produkty mogą mieć inny kolor i/lub materiału. Na przykład. Mogę mieć produkt, który ma jedną lub więcej opcji materiałowych, ale nie ma kolorów powiązanych i na odwrót. Wyjście powinno być coś takiego:

----------------------------------------------------------------------------- 
| PRODUCT_ID | PRODUCT_NAME | COLOR_ID | MATERIAL_ID | IMAGE_ID | SIZE_ID | 
----------------------------------------------------------------------------- 
| 1   | T-SHIRT  | 1  | null  | 1  | 1  | 
| 1   | T-SHIRT  | 1  | null  | 1  | 2  | 
| 1   | T-SHIRT  | 1  | null  | 1  | 3  | 
| 1   | T-SHIRT  | 1  | null  | 1  | 4  | 
| 2   | JEANS   | null  | 1   | 2  | 1  | 
| 2   | JEANS   | null  | 1   | 2  | 2  | 
| 2   | JEANS   | null  | 1   | 2  | 3  | 
| 2   | JEANS   | null  | 1   | 2  | 4  | 
| 2   | JEANS   | null  | 1   | 2  | 5  | 
| 3   | T-SHIRT VNECK | 2  | 2   | 3  | 1  | 
| 3   | T-SHIRT VNECK | 2  | 2   | 3  | 2  | 
| 3   | T-SHIRT VNECK | 3  | 2   | 4  | 1  | 
| 3   | T-SHIRT VNECK | 3  | 2   | 4  | 2  | 
| 3   | T-SHIRT VNECK | 4  | 3   | 5  | 1  | 
| 3   | T-SHIRT VNECK | 4  | 3   | 5  | 2  | 
----------------------------------------------------------------------------- 

Próbowałem następujące oświadczenie ale zwraca 0 wierszy:

SELECT PRODUCTS.PRODUCT_ID, PRODUCTS.PRODUCT_TITLE, COLORS.COLOR_ID, MATERIALS.MATERIAL_ID, IMAGES.IMAGE_ID, SIZE.SIZE_ID from PRODUCTS 
    INNER JOIN PRODUCT_COLOR ON (PRODUCTS.PRODUCT_ID = PRODUCT_COLOR.PRODUCT_ID) 
    INNER JOIN COLORS ON (COLORS.COLOR_ID = PRODUCT_COLOR.COLOR_ID) 
    INNER JOIN PRODUCT_MATERIAL ON (PRODUCTS.PRODUCT_ID = PRODUCT_MATERIAL.PRODUCT_ID) 
    INNER JOIN MATERIALS ON (MATERIALS.MATERIAL_ID = PRODUCT_MATERIAL.MATERIAL_ID) 
    INNER JOIN PRODUCT_IMAGE ON (PRODUCTS.PRODUCT_ID = PRODUCT_IMAGE.PRODUCT_ID) 
    INNER JOIN IMAGES ON (IMAGES.IMAGE_ID = PRODUCT_IMAGE.IMAGE_ID) 
    INNER JOIN PRODUCT_SIZE ON (PRODUCTS.PRODUCT_ID = PRODUCT_SIZE.PRODUCT_ID) 
    INNER JOIN SIZE ON (SIZE.SIZE_ID = PRODUCT_SIZE.SIZE_ID) 
    ORDER BY PRODUCTS.id_PRODUCT; 

jakieś pomysły?

Odpowiedz

19

Można zrobić coś takiego:

select p.product_id, 
    p.product_name, 
    c.color_id, 
    m.material_id, 
    i.image_id, 
    s.size_id 
from products p 
left join product_color pc 
    on p.product_id = pc.product_id 
left join colors c 
    on pc.color_id = c.colorid 
left join product_material pm 
    on p.product_id = pm.product_id 
left join materials m 
    on pm.material_id = m.material_id 
left join product_image pi 
    on p.product_id = pi.product_id 
left join images i 
    on pi.image_id = i.image_id 
    or c.color_id = i.color_id 
    or m.material_id = i.material_id 
left join product_size ps 
    on p.product_id = ps.product_id 
left join size s 
    on ps.size_id = s.size_id 

Radziłbym ci przeglądając JOIN s. W Internecie jest świetna visual explanation of joins, która pomoże ci napisać te zapytania.

+0

@Sprite Myślę, że trzeba użyć 'LEFT JOIN' zamiast' WEWNĘTRZNEJ JOIN' – Taryn

+0

Tak. Link, który mi dałeś, bardzo mi pomógł. – Samuel

+0

idealne !!!! dzięki –

2

Cóż, musisz nauczyć się budować sprzężenia, a sposób, w jaki normalnie to robię, polega na wybraniu jednego stołu i dołączeniu do następnego i następnego, aż uzyskam pożądany rezultat.

select product_id, product_name 
    from products 

obok łączę się pierwszy muszę więc śmiało powiedzieć

select p.product_id, p.product_name, pc.color_id 
    from products p 
    join product_color pc on (pc.product_id = p.product_id) 

na przyłączenia ważne, aby dowiedzieć się, czy ja może mieć nic do przyłączenia się i nadal chcę zobacz linię. Tak więc raczej używam lewego łącznika

 select p.product_id, p.product_name, pc.color_id 
     from products p 
    left join product_color pc on (pc.product_id = p.product_id) 

W ten sposób dodasz każdą tabelę do przyłączenia. Tak poza tym. Czy to zadanie domowe?

+0

Nie prac domowych, prowadzę studium przypadku, aby odfiltrować te produkty. – Samuel

+0

Dobrze. Wyglądało to. Czy moja lub jedna z odpowiedzi pomaga w zbudowaniu zapytania? Dla mnie to było bardzo podstawowe pytanie, czy może brakowało mi punktu? – hol

+0

Szczerze mówiąc, nie napisałem żadnej linii sql od czasów college'u ... A klasy db były bardzo słabe. Potrzebowałem tylko tych tabel, aby uruchomić mój prototyp i zbadać opcje filtrowania. – Samuel

0

Jeśli wystarczy identyfikatory, keep it simple

select p.product_id, 
    p.product_name, 
    pc.color_id, 
    pm.material_id, 
    pi.image_id, 
    ps.size_id 
from products p, 
PRODUCT_COLOR pc, 
product_material pm, 
PRODUCT_SIZE ps, 
PRODUCT_IMAGE pi 
where 
p.product_id = pc.product_id(+) 
and p.product_id = pm.product_id(+) 
and p.product_id = ps.product_id(+) 
and p.product_id = pi.product_id(+); 
+0

OP określa, że ​​'COLOR_ID' i' MATERIAL_ID' mogą mieć wartość null. – Kermit

+0

oops przegapił ten ... Wykonał modyfikację, aby dołączyć do zewnętrznego – Kamal