2

如果它们与数组中的所有项目匹配,我在尝试从表中检索所有产品 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。我如何让它匹配?我希望我能够以一种可以理解的方式描述这个问题,我真的很难绕着它问一个问题。

4

2 回答 2

3

这称为关系除法。

SELECT  produktID
FROM    tableName
WHERE   ingredientID IN (1,5,6)
GROUP   BY produktID
HAVING  COUNT(*) = 3

ingredientID如果没有对每个强制执行唯一约束produktID,那么您需要使用DISTINCT

SELECT  produktID
FROM    tableName
WHERE   ingredientID IN (1,5,6)
GROUP   BY produktID
HAVING  COUNT(DISTINCT ingredientID) = 3

其他来源

于 2013-01-17T15:19:05.073 回答
2

试试这个:

SELECT pi.productID, p.productName
FROM products_ingredients_mm pim 
INNER JOIN products p ON pim.productID = p.productID 
WHERE ingredientID IN (1,5,6)
GROUP BY productID
HAVING COUNT(DISTINCT ingredientID) = 3
于 2013-01-17T15:24:12.017 回答