2017-07-17 60 views
1

搜索时,我有如下表:选择所有属性的一个

表:属性

+---------------+-------------+ 
| 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时,我需要所有属性。

所以我得到是这样的:我只得到'颜色'属性,但正如你所看到的,具体的产品也有'材料'属性。

所以,当我搜索红色的产品时,我还想要该特定产品的其他属性(材质=金属)。

+0

将两个条件移动到各自的JOIN – Strawberry

+0

我想我找到了解决方案,我将它作为答案发布。你可以检查一下吗? – yesterday

+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

我想我找到了答案:

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') 
相关问题