2013-10-05 34 views
0

我可以使用一些幫助。這是一個現實生活中的問題,而不是家庭作業。我嘗試了各種各樣的外部聯合和聯合聲明,但我只是弄得一團糟。需要聯合和/或外連接的SQL查詢需要

我有3個表:

Table "item": 
id | name 
--------- 
1 | 'Item 1' 
2 | 'Item 2' 

Table "property_type": 
id | name 
------------------ 
105 | 'Property A' 
106 | 'Property B' 
107 | 'Property C' 

Table "property" (fk stands for foreign key): 
id | fk_item | fk_property_type | value 
--------------------------------------------------------------------- 
1044 | 1  | 106    | 'some value for prop B of item 1' 
1045 | 2  | 107    | 'some value for prop C of item 2' 

現在我需要產生一個屬性表對於一個給定的產品ID,顯示每個屬性類型的線路,即使不是所有的資產,由於該項目集的語句,例如如果我對第1項感興趣,輸出應爲:

item_name | property_type_name | property_value 
------------------------------------------------------------------ 
'Item 1' | 'Property A'  | NULL 
'Item 1' | 'Property B'  | 'some value for prop B of item 1' 
'Item 1' | 'Property C'  | NULL 

並隨時提出更好的問題標題。如果我知道如何更好地表達這個問題,我可能會通過搜索自己找到答案。

+0

這總是會一團糟。如果你堅持走下EAV路線,你需要的是一個其他的表DefaultProperties,它將Item連接到PropertyType。目前所有你能得到的是笛卡爾產品,只有在所有產品都具有所有特性的情況下才可以接受。 –

+0

你打電話的PS也有一個預填充的default_value,如果這可能會派上用場。 –

+0

什麼是EAV?默認值只是NULL,是不是有辦法將這個默認值表作爲臨時表在動態語句內部建立? – Zalumon

回答

2
SELECT 
    i . name AS item_name, 
    pt . name AS property_type_name, 
    p . value AS property_value 
FROM 
    item AS i 
    CROSS JOIN 
    property_type AS pt 
    LEFT JOIN 
    property AS p 
     ON p.fk_item = i.id 
     AND p.fk_property_type = pt.id 
WHERE 
    i.id = 1 ;      -- given item ID 
+0

謝謝,我現在正在測試這個過程... – Zalumon

+0

偉大的,這變得比我擔心會更簡單!我一直試圖從'property_type'表中初始選擇。非常感謝你! – Zalumon