Mysql 联接表上的SQL查询

Mysql 联接表上的SQL查询,mysql,sql,select,inner-join,Mysql,Sql,Select,Inner Join,我有以下SQL模式: +----------+ | products | +----------+ | id | | name | +----------+ ^ 8 | v 1 +-------------+ | values | +-------------+ | value | | product_id | | property_id | +-------------+ ^ 8 | v 1 +----

我有以下SQL模式:

+----------+
| products |
+----------+
| id       |
| name     |
+----------+
    ^ 8
    |
    v 1
+-------------+
|   values    |
+-------------+
| value       |
| product_id  |
| property_id |
+-------------+
    ^ 8
    |
    v 1
+------------+
| properties |
+------------+
| id         |
| name       |
+------------+
一个产品具有多个属性,而一个属性属于多个产品。
值表是
产品
属性
之间多对多关联的联接表。此表中保存了产品的属性值

现在我正在寻找一个查询,以选择所有具有属性
x
和值
a
的产品,以及具有值
b
ecc的属性
y
。我尝试此查询,但未返回任何记录:

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

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

因为属性不能同时是
颜色
大小
,您需要在
where
子句中使用
。然后对数据进行分组,并检查两者是否都属于
have

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

另一种方法是使用
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')

我会使用
分组方式
拥有

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;