Mysql 联接表上的SQL查询
我有以下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 +----
+----------+
| 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;