2013-10-05 36 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