5

桌子

recipe_food_xref
recipe_id int
food_id int

需要在 recipe_food_xref 中找到一个记录,其中食谱只有一种食物并且该食物是特定食物。

它与自身完美结合:

SELECT x1.recipe_id FROM recipe_food_xref x1
INNER JOIN recipe_food_xref x2 ON x2.recipe_id = x1.recipe_id
WHERE x1.food_id = 1
GROUP BY x1.recipe_id
HAVING COUNT(x2.recipe_id) = 1

这似乎有点难看,我想知道是否有更好的方法。

这是一个带有一些示例数据的 SqlFiddle。基本上我想找到 recipe_id:1 因为它有 food_id:1 并且没有超过一个 food_id

http://sqlfiddle.com/#!3/6d474/1

4

4 回答 4

2
SELECT recipe_id 
FROM recipe_food_xref
GROUP BY recipe_id
HAVING sum(case when food_id = 1 then 1 else 0 end) = 1
and sum(case when food_id <> 1 then 1 else 0 end) = 0

SQLFiddle 演示

于 2013-10-02T13:11:01.437 回答
1

这是我第一次去:

SELECT recipe_id
FROM recipe_food_xref
GROUP BY recipe_id
HAVING COUNT(food_id) = 1 AND SUM(food_id) = 1;

请注意,一般格式是HAVING COUNT(FOOD_ID) = 1 AND SUM(FOOD_ID) = <food id>. 它之所以有效,是因为如果只有一个 food_id,那么总和就等于 id。

似乎类似于 Juergen 的答案,但更简单。我错过了什么?

我还尝试了以下方法,它必须额外扫描表格,但因为我以前从未使用过ALL关键字,所以我认为这很有趣。

SELECT recipe_id
FROM recipe_food_xref AS r
WHERE 1 = ALL (SELECT food_id FROM recipe_food_xref WHERE r.recipe_id=recipe_id);

http://sqlfiddle.com/#!3/6d474/26

于 2013-10-02T13:54:21.320 回答
0
select *
from recipe_food_xref x
where not exists (
                   select i.food_id
                   from recipe_food_xref i
                   where i.recipe_id = x.recipe_id and
                         i.food_id <> x.food_id
                 ) 
-- if this is omitted you get all recipes having just one food:
      and x.food_id = 1
于 2013-10-02T13:17:57.767 回答
0

这是我对问题的解释:

查找所有具有单一成分的食谱。在这些食谱中,找到单一成分为 X 的食谱

SELECT recipe_id
     , Max(food_id) As food_id
     , Count(*) As number_of_ingredients
FROM   recipe_food_xref
GROUP
    BY recipe_id
HAVING Count(*) = 1
AND    Max(food_id) = 1
于 2013-10-02T13:31:58.707 回答