我在包和产品之间有了以下关联表(简化):
package_id product_id count
1 1 6
1 2 1
1 3 1
2 1 6
2 2 1
3 1 6
4 1 8
4 2 1
我正在尝试研究如何创建一个能够选择特定package_id
的查询,其中包含我提供的产品及其数量。因此,如果我要查找包含(product_id = 1 AND count = 6) AND (product_id = 2 AND count = 1)
的包,则仅返回package_id
2而不是其他包,因为其中包含其他产品和/或其他计数。
我很乐意在我的代码(PHP)而不是SQL中解决这个问题,但是因为我试图深入了解查询,所以我想知道这是如何完成的。
答案 0 :(得分:1)
这称为Relational Division
SELECT a.package_ID
FROM tableName a
WHERE (a.product_ID = 1 AND a.count = 6) OR
(a.product_ID = 2 AND a.count = 1)
GROUP BY a.package_ID
HAVING COUNT(*) = 2 AND
COUNT(*) = (SELECT COUNT(*) FROM tableName WHERE package_ID = a.package_ID)
OR
SELECT package_ID
FROM tableName
WHERE (product_ID, `count`) in ((1, 6), (2, 1))
GROUP BY package_ID
HAVING COUNT(DISTINCT product_ID, `count`) = 2 AND
COUNT(*) = (SELECT COUNT(*) FROM tableName WHERE package_ID = a.package_ID)