我在尝试从表中检索所有产品 ID(如果它们与数组中的所有项目匹配)时遇到问题,在这种情况下,仅当产品包含用户搜索的所有成分时才返回产品。
表格是这样的
ID produktID ingredientID
----------------------------
1 418 1
2 418 2
3 418 3
4 416 4
5 411 1
6 411 5
7 411 6
我从存储主要信息的产品表加入此表。查询的目的应该是仅当所有成分 ID 都与给定数组匹配时才检索产品 ID。我试过使用 WHERE ingredientID IN(1,5,6)
但它总是证明是一个 OR 语句,返回匹配任何成分的每个 ID。
因此,例如,如果我通过 (1,5,6) 或 (5,6),则应返回产品 ID 411,但如果我通过 (2,5,6),则不应返回。
我尝试的查询看起来像这样(经过简化,它是连接到品牌和类别等其他关系的 5 种方式的一部分)
SELECT productID FROM products_ingredients_mm WHERE ingredientID IN (1,5,6) GROUP BY productID
但结果也包含 418。我如何让它匹配? 我希望我能够以一种可以理解的方式描述问题,我真的很难绕着它问一个问题。
最佳答案
这称为关系划分。
SELECT produktID
FROM tableName
WHERE ingredientID IN (1,5,6)
GROUP BY produktID
HAVING COUNT(*) = 3
如果没有对每个 produktID
的 ingredientID
强制执行唯一约束,那么您需要使用 DISTINCT
SELECT produktID
FROM tableName
WHERE ingredientID IN (1,5,6)
GROUP BY produktID
HAVING COUNT(DISTINCT ingredientID) = 3
其他来源
关于MySQL从匹配数组的表中获取所有相关ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14382224/