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:没错。请检查我的答案,我认为它是正确的。很抱歉要求快点,我应该在发布之前再尝试一下。