2017-07-17 85 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') 
相關問題