【问题标题】:SQL query on join table连接表上的 SQL 查询
【发布时间】:2018-05-11 21:11:50
【问题描述】:

我有以下 SQL 架构:

+----------+
| products |
+----------+
| id       |
| name     |
+----------+
    ^ 8
    |
    v 1
+-------------+
|   values    |
+-------------+
| value       |
| product_id  |
| property_id |
+-------------+
    ^ 8
    |
    v 1
+------------+
| properties |
+------------+
| id         |
| name       |
+------------+

一个产品有很多属性,一个属性属于很多产品。 values 表是productsproperties 之间的many_to_many 关联的连接表。并且在此表中保存了产品的属性值。

现在我正在寻找一个查询来选择属性为x 的所有产品,其值为a,属性y 的值为b ecc。我的尝试是这个查询,但不返回任何记录:

SELECT DISTINCT 
    products.* 
FROM 
    products 
INNER JOIN 
    product_values 
    ON product_values.product_id = products.id 
INNER JOIN 
    properties 
    ON properties.id = product_values.property_id 
WHERE 
    (properties.name = 'size' AND product_values.value = 'big') 
    AND (properties.name = 'color' AND product_values.value = 'red')

如果可能,我需要一个没有嵌套选择的查询。

【问题讨论】:

    标签: mysql sql select inner-join


    【解决方案1】:

    由于一个属性不能同时为colorsize,您需要在where 子句中使用OR。然后对数据进行分组,并检查两者是否都在与having的组中

    SELECT products.id, products.name
    FROM `products` 
    INNER JOIN `product_values` ON `product_values`.`product_id` = `products`.`id` 
    INNER JOIN `properties` ON `properties`.`id` = `product_values`.`property_id` 
    WHERE (properties.name = 'size' AND product_values.value = 'big') 
       OR (properties.name = 'color' AND product_values.value = 'red')
    GROUP BY products.id, products.name
    HAVING count(distinct properties.name) = 2
    

    【讨论】:

      【解决方案2】:

      我会使用group byhaving 来做到这一点:

      select pv.product_id
      from product_values pv join
           properties p
           on pv.property_id = p.id
      where (p.name, v.value) in ( ('size', 'big'), ('color', 'red') )
      group by pv.product_id
      having count(distinct p.name) = 2;
      

      【讨论】:

        【解决方案3】:

        另一种使用sum 过滤实体多个属性的方法

        SELECT  
          `p`.* 
        FROM
          `products` p
          INNER JOIN `product_values` v
            ON `v`.`product_id` = `p`.`id` 
          INNER JOIN `properties`  pr
            ON `pr`.`id` = `v`.`property_id` 
        GROUP BY p.id
        HAVING SUM (pr.name = 'size' AND v.value = 'big') 
          AND SUM(pr.name = 'color' AND v.value = 'red')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-18
          • 1970-01-01
          • 2015-06-09
          • 2015-12-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多