Mysql 搜索一个属性时选择所有属性
我有以下表格: 表:属性Mysql 搜索一个属性时选择所有属性,mysql,Mysql,我有以下表格: 表:属性 +---------------+-------------+ | attribute_id | name | +---------------+-------------+ | 1 | color | | 2 | material | +---------------+-------------+ +---------------------+-----------------+---
+---------------+-------------+
| attribute_id | name |
+---------------+-------------+
| 1 | color |
| 2 | material |
+---------------+-------------+
+---------------------+-----------------+--------------+--------------+
| attribute_value_id | attribute_id | product_id | value |
+---------------------+-----------------+--------------+--------------+
| 1 | 1 | 1 | blue |
| 2 | 2 | 1 | metal |
| 3 | 1 | 2 | red |
| 4 | 2 | 2 | metal |
+---------------------+-----------------+--------------+--------------+
表:属性值
+---------------+-------------+
| attribute_id | name |
+---------------+-------------+
| 1 | color |
| 2 | material |
+---------------+-------------+
+---------------------+-----------------+--------------+--------------+
| 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子句匹配时,我需要所有属性
因此,我得到的是:我只得到了“颜色”属性,但正如你所看到的,特定的产品也有一个“材质”属性
因此,当我搜索红色产品时,我还需要该特定产品的其他属性(材质=金属)。我想我找到了答案:
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')
我想我找到了答案:
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')
这里有一个想法-简化为它的本质
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\u value\u id
似乎没有任何作用。这里有一个想法——简化为它的本质
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\u value\u id
似乎没有任何作用。将这两个条件移动到各自的连接处。我想我已经找到了解决方案,我会将其作为答案发布。你能检查一下吗?我相信你的where标准与你想要达到的目标不匹配。您可能希望将where拆分为它们所在的连接belong@AtillaArdaAçıkgöz:没错。请检查我的答案,我认为它是正确的。我很抱歉要求快速,我应该在发布之前尝试更多。将这两个条件移动到各自的连接处。我认为我已经找到了解决方案,我会将其作为答案发布。你能检查一下吗?我相信你的where标准与你想要达到的目标不匹配。您可能希望将where拆分为它们所在的连接belong@AtillaArdaAçıkgöz:没错。请检查我的答案,我认为它是正确的。很抱歉要求快点,我应该在发布之前再尝试一下。