搜索一个

时间:2017-07-17 14:42:03

标签: mysql

我有以下表格:

表格:属性

+---------------+-------------+
| 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属性(材料=金属)。

2 个答案:

答案 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')