一个查询的多个属性

时间:2011-11-25 21:10:03

标签: mysql sql entity-attribute-value

我在为一个项目获取多个属性时遇到问题。以下是我的表:

表: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"

你看到我如何只设置一个属性? 有没有办法让所有产品的属性?

2 个答案:

答案 0 :(得分:1)

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

可以反转JOIN中表格的顺序,以防止product_attrib这样的行丢失(如果product product_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.*;

答案 1 :(得分:-2)

我看到很多人在没有必要的时候写完全联接。如果我错了,请纠正我。

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