1

我目前正在处理 3 张桌子。配方、成分和配方。这是经典的多对多情况,recipeIng 可以解决这个问题。

但是,我无法获得我认为的一个相当简单的“AND”查询。我想要实现的是一次搜索多种成分。例如:

SELECT r.recipeTitle AS recipe
FROM Recipe r
WHERE recipeID IN(
    SELECT r.recipeID
    FROM recipeIng il, Ingredient i
    WHERE (il.ingredientID = i.ingredientID)
    AND (il.recipeID = r.recipeID)
    AND (i.ING LIKE '%cheese%' AND i.ING LIKE '%salmon%')

);

查询运行时,它不输出任何内容。我似乎看不到我在这里做错了什么。任何帮助将非常感激。

谢谢。

4

3 回答 3

3

所以基本上你想要包含你查询的任何成分的食谱。这可以使用简单的直接连接来执行:

SELECT DISTINCT(r.recipeTitle) AS recipe
FROM Ingredient i
INNER JOIN recipeIng il ON il.ingredientID = i.ingredientID
INNER JOIN Recipe r ON r.recipeID = il.recipeID
WHERE i.ING LIKE '%cheese%' OR i.ING LIKE '%salmon%'

DISTINCT()确保您不会两次看到相同的食谱,以防它包含两种成分。

如果这两种成分都必须存在于食谱中,则必须使用AND而不是OR.

于 2013-02-07T14:09:38.940 回答
2

首先,您的查询可以大大简化,因为您不需要外部查询。以下是完全相同的:

SELECT r.recipeTitle AS recipe
FROM recipeIng il, Ingredient i, Recipe r
WHERE (il.ingredientID = i.ingredientID)
AND (il.recipeID = r.recipeID)
AND (i.ING LIKE '%cheese%' AND i.ING LIKE '%salmon%')

其次,您不需要所有这些括号。

SELECT r.recipeTitle AS recipe
FROM recipeIng il, Ingredient i, Recipe r
WHERE il.ingredientID = i.ingredientID
AND   il.recipeID = r.recipeID
AND   i.ING LIKE '%cheese%' 
AND i.ING LIKE '%salmon%'

第三,您应该 INNER JOIN 表以使它们之间的关系更清晰:

SELECT r.recipeTitle AS recipe
FROM recipeIng il JOIN 
     Ingredient i ON  il.ingredientID = i.ingredientID JOIN
     Recipe r ON il.recipeID = r.recipeID
WHERE i.ING LIKE '%cheese%' 
AND   i.ING LIKE '%salmon%'

至此,问题应该很清楚了——有 2 种可能的可能性,2 种可能性大于 1 种可能性。

1) 您的ING字段将配方的所有成分存储在一个字段中。如果是这种情况,那么您没有一个食谱,其成分需要奶酪和鲑鱼。

2) 您的ING字段每行仅存储 1 种成分。Cheese但是,您要求的是包含和的单行Salmon。这不是您的意图,因此查询是错误的。

-- SELECT ALL RECIPES USING CHEESE *OR* SALMON
SELECT r.recipeTitle AS recipe
FROM recipeIng il JOIN 
     Ingredient i ON  il.ingredientID = i.ingredientID JOIN
     Recipe r ON il.recipeID = r.recipeID
WHERE i.ING LIKE '%cheese%' 
AND   i.ING LIKE '%salmon%'

-- SELECT ALL RECIPES USING CHEESE *AND* SALMON
SELECT r.recipeTitle AS recipe
FROM recipeIng il JOIN 
     Ingredient iCheese 
         ON  il.ingredientID = i.ingredientID 
         AND i.ING LIKE '%cheese%'  JOIN
     Ingredient iSalmon 
         ON  il.ingredientID = i.ingredientID 
         AND i.ING LIKE '%salmon%'  JOIN 
     Recipe r ON il.recipeID = r.recipeID

请注意,以上仅为示例 - 在不了解您的架构的情况下,这些只是提示和建议 :)

于 2013-02-07T14:05:07.303 回答
2

使用i.ING LIKE '%cheese%' OR i.ING LIKE '%salmon%'而不是AND,并添加GROUP BY r.recipeIDwithHAVING COUNT(DISTINCT i.ING ) = 2以确保所选内容r.recipeID同时具有ING

SELECT r.recipeTitle AS recipe
FROM Recipe r
WHERE recipeID IN(
    SELECT r.recipeID
    FROM recipeIng il
    INNER JOIN Ingredient i ON il.ingredientID = i.ingredientID 
    WHERE il.recipeID = r.recipeID
      AND (i.ING LIKE '%cheese%' OR i.ING LIKE '%salmon%')
    GROUP BY r.recipeID
    HAVING COUNT(DISTINCT i.ING ) = 2
);

SQL 小提琴演示

因此,如果r.recipeID只有其中一个,则COUNT(DISTINCT i.ING )不会等于 2,因此它将被淘汰。

HAVING COUNT(DISTINCT i.ING ) = 2将为您提供那些只有奶酪和鲑鱼两个标签的食谱,没有更多成分,如果您正在寻找那些至少具有两种成分的食谱,请使用`HAVING COUNT(DISTINCT i.ING ) >= 2

这是假设成分ING作为每行一个值输入到字段中。

于 2013-02-07T14:05:09.527 回答