2011-11-25 157 views
0

我在为一个项目获取多个属性时遇到问题。下面是我的表:来自一个查询的多个属性

表:product_attrib

id | product_id | name | value 
------------------------------ 
0 |   33 | age | 25 
1 |   33 | size | 25 

我的问题是,当我加入了查询,我只得到一个属性有这样一个查询:

查询:

SELECT 
    p.* 
    ,pa.name 
    ,pa.value 
FROM product AS p 
LEFT OUTER JOIN product_attrib AS pa ON (
    p.id = pa.product_id 
) 

我的结果

"products_id":"0", 
"products_price":"0.0000", 
"products_name":null, 
"products_description":null, 
"attrib_name":"color", 
"attrib_value":"red" 

您是否看到我如何获得一个属性集? 有没有一种方法我可以得到全部产品的属性?

+1

这是令人困惑的问题。请重写你的问题。 –

回答

1

很可能,您的原始查询是正确的。无论是否可以找到属性,您可能都需要该产品。

可以扭转在JOIN表的顺序,以防止丢失行从product_attrib像这样(如果productproduct_id 33不存在):

SELECT 
    p.* 
    ,pa.name 
    ,pa.value 
FROM product_attrib AS pa 
LEFT JOIN product AS p ON p.id = pa.product_id 

但是这可能不是你想要的。

LEFT [OUTER] JOIN包括从所述左手表中的所有行和从右侧表所在的JOIN条件可以被满足(潜在地产生多个行,如果多个匹配在右手表中找到)。如果没有匹配的增加值行可以在右手表中找到NULL值被替换为右手表的所有列。
reading the manual here开始。

如果要在同一行中的每个产品的“所有属性”,则需要aggregate values。这样的事情:

SELECT p.* 
     ,group_concat(pa.name) AS att_names 
     ,group_concat(pa.value) AS att_values 
FROM product AS p 
LEFT JOIN product_attrib AS pa ON p.id = pa.product_id 
WHERE p.product_id = 33 
GROUP BY p.*; 
+0

啊,总结是我失踪!非常感谢你,我很欣赏你给我回答这个问题的时间:) – JREAM

-2

我看到很多人写完整的联接,当他们没有必要。如果我错了,请纠正我。

SELECT 
    p.* 
    ,pa.name 
    ,pa.value 
FROM product AS p, product_attrib AS pa 
WHERE p.id = pa.product_id 
+0

你错了两种方式:1)这不是一个LEFT JOIN。 2)在任何情况下,明确的JOIN语法都是正确的方法。 –

+0

为什么需要左连接?是否有文档说明JOIN更合适?这可以用更少的代码完成同样的事情(尽管如果产品没有属性,它将不会返回任何内容)。 – Julien

+1

这与“INNER JOIN”完全相同,与“LEFT JOIN”不同。如果我们想要显示没有属性的产品,则需要'LEFT JOIN'。较少的代码,不。我计算了相同数量的代码。文档是已有19年历史的SQL-92标准。 –