问题: 我想选择具有1和3的option_value_id的产品。但是,正如您所看到的,它还将显示仅具有1个option_value_ids的产品。
我尝试添加AND代替IN,但显然没有显示结果。
答案可能很简单,但我现在似乎无法弄明白。 有人可以帮帮我吗?即使是一个小提示也可以被欣赏。
答案 0 :(得分:4)
这称为Relation Division,这是一种方法:
SELECT *
FROM TABLEName
WHERE Product_ID IN(SELECT Product_ID
FROM Tablename
WHERE option_value_id IN(1, 3)
GROUP BY Product_ID
HAVING COUNT(option_value_id) = 2);
这会给你:
| ID | PRODUCT_ID | OPTION_VALUE_ID |
-------------------------------------
| 1 | 1 | 1 |
| 3 | 1 | 3 |
| 13 | 2 | 3 |
| 14 | 2 | 1 |
答案 1 :(得分:0)
这是将事物看作一组的例子。我认为最好的方法是使用SQL的聚合,特别是having子句。在MySQL语法中,这看起来像:
select pa.product_id
from Product_Attributes pa
group by pa.product_id
having max(pa.option_value_id = 1) = 1 and
max(pa.option_value_id = 3) = 1
答案 2 :(得分:0)
这是一个常见问题,称为关系部门,在SO中甚至还有一个标记: sql-match-all
通常,(product_id, option_value_id)
有一个唯一约束,因此一种解决方案是使用2个连接(如果要检查N个属性,则为N个连接):
SELECT p.* -- whatever columns you need
FROM product AS p -- from the `product` table
JOIN products_attributes AS pa1
ON pa1.option_value_id = 1
AND pa1.product_id = p.product_id
JOIN products_attributes AS pa2
ON pa2.option_value_id = 3
AND pa2.product_id = p.product_id ;
有一个类似的问题,有超过10种不同的方法可以达到相同的结果(和Postgres的基准): How to filter SQL results in a has-many-through relation
答案 3 :(得分:0)
试试这个:
SELECT *
FROM products_attributes
WHERE option_value_id IN (1, 3)
GROUP BY product_id
HAVING COUNT(*) = 2