我有以下表格:
表格:属性
+---------------+-------------+
| attribute_id | name |
+---------------+-------------+
| 1 | color |
| 2 | material |
+---------------+-------------+
表格: attribute_values
+---------------------+-----------------+--------------+--------------+
| attribute_value_id | attribute_id | product_id | value |
+---------------------+-----------------+--------------+--------------+
| 1 | 1 | 1 | blue |
| 2 | 2 | 1 | metal |
| 3 | 1 | 2 | red |
| 4 | 2 | 2 | metal |
+---------------------+-----------------+--------------+--------------+
我有以下问题:
SELECT
p.product_id AS product_id,
p.name AS product_name,
v.value AS attribute_value,
a.attribute_id AS attribute_id,
a.attribute_category_id AS attribute_category_id,
a.name AS attribute_name,
c.name AS attributes_category_name
FROM
products p
LEFT JOIN
attribute_values v USING (product_id)
LEFT JOIN
attributes a USING (attribute_id)
LEFT JOIN
attribute_categories c USING (attribute_category_id)
WHERE
(a.name = 'color' AND v.value = 'red')
查询的问题是:当产品与WHERE-clausule匹配时,我需要所有属性。
所以,我得到的原因是:我只获得了颜色' -attribute,但正如您所看到的,特定产品还有一个'材料& #39; -attibute
因此,当我搜索红色的产品时,我也想要特定产品的OTHER属性(材料=金属)。
答案 0 :(得分:1)
这是一个想法 - 简化为其本质......
SELECT x.*
FROM
( SELECT product_id
, MAX(CASE WHEN attribute_id = 1 THEN value END) color
, MAX(CASE WHEN attribute_id = 2 THEN value END) material
FROM attribute_values
GROUP
BY product_id
) x
WHERE color = 'red';
哦,请注意,attribute_value_id
似乎没有用处。
答案 1 :(得分:-1)
我想我找到了答案:
SELECT
p.product_id AS product_id,
p.name AS product_name,
v.value AS attribute_value,
a.attribute_id AS attribute_id,
a.attribute_category_id AS attribute_category_id,
a.name AS attribute_name,
c.name AS attributes_category_name
FROM
products p
LEFT JOIN
attribute_values v USING (product_id)
LEFT JOIN
attributes a USING (attribute_id)
LEFT JOIN
attribute_categories c USING (attribute_category_id)
WHERE
p.product_id IN (SELECT p.product_id FROM products p LEFT JOIN attribute_values v USING (product_id) LEFT JOIN attributes a USING (attribute_id) WHERE a.name = 'color' AND v.value = 'red')