我在为一个项目获取多个属性时遇到问题。以下是我的表:
表: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"
你看到我如何只设置一个属性? 有没有办法让所有产品的属性?
答案 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