2012-08-27 64 views
11

我有這四個表連接內有多個表

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) 

所有的產品都可以有不同的顏色和/或材料。例如。我可以擁有一種具有一種或多種材質選項但沒有顏色關聯的產品,反之亦然。輸出應該是這樣的:

----------------------------------------------------------------------------- 
| 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  | 
----------------------------------------------------------------------------- 

我曾嘗試以下語句,但它返回0行:

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; 

任何想法?

回答

19

你可以做這樣的事情:

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 

我會建議你回顧JOIN秒。有一個偉大的visual explanation of joins在線,這將幫助你寫這些查詢。

+0

@Sprite我認爲你需要使用'LEFT JOIN'代替'INNER JOIN' – Taryn

+0

是的。你給我的鏈接幫了我很多。 – Samuel

+0

完美!!!!謝謝 –

2

那麼,你需要學習如何構建連接,而我通常的做法是選擇一個表並加入下一個表,然後加入下一個表,直到獲得我想要的結果。

select product_id, product_name 
    from products 

下一個我參加的第一個,我需要讓我先走,說

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

在參加重要的是要弄清楚,如果我也許什麼都沒有加入有和我還是想看到這一行。所以我寧願使用左連接

 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) 

這樣你添加每個表加入。順便一提。這是功課嗎?

+0

不是作業,我正在運行一個案例研究來過濾這些產品。 – Samuel

+0

好。看起來像。那麼,我的還是其中一個答案可以幫助您構建查詢?對我來說,這看起來像是非常基本的問題,或者我錯過了一個觀點? – hol

+0

說實話,自從大學以後,我沒有寫任何sql語句......而db類非常窮。我只需要這些表格就可以運行原型並研究過濾器選項。 – Samuel

0

如果你只需要身份證,保持它的簡單

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指定「COLOR_ID」和「MATERIAL_ID」可以爲空。 – Kermit

+0

哎呀錯過了..做了修改,使其外部連接 – Kamal