Найти записи в таблицу соединения, которые имеют только одну строку

Обновить

November 2018

Просмотры

654 раз

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 ответы

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
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, то сумма равна ид.

Кажется, похож на ответ Юргена, но проще. Я что-то пропустил?

Я также попытался следующие, который должен сканировать таблицу дополнительных раз , но , как я никогда не использовал 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

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 демо

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

Связанные вопросы