Sql - Как получить рецепты одного аромата из промежуточного стола - PullRequest
0 голосов
/ 11 мая 2018

Как вы можете видеть в таблице ниже, некоторые рецепты имеют 2 или более ароматов, но некоторые имеют только 1. Я хочу забрать таблицу с flavor_id и flavour_amount рецептов с одним ароматом.Мне удалось получить некоторую информацию, но я тоже не могу взять flavor_amount .. Самый близкий, который я получил, с этим запросом

SELECT COUNT('flavor_id') as flavors, `recipe_id`, 
MAX(flavor_id) as flavor_id 
FROM `flavor_recipe` 
GROUP BY `recipe_id` 
HAVING flavors = 1;

Но все равно ничего.Любая помощь, пожалуйста?Спасибо.

enter image description here

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Вы можете объявить concat с максимальным и минимальным значением.Но только в одном столбце можно увидеть два идентификатора.

SELECT COUNT('flavor_id') as flavors, `recipe_id`, CONCAT(MIN(flavor_id), MAX(flavor_id)) as flavor_id FROM `flavor_recipe` GROUP BY `recipe_id` HAVING flavors = 1;
0 голосов
/ 11 мая 2018

Если у вас включен режим ONLY_FULL_GROUP_BY SQL, вы можете отключить проверку агрегации для определенного значения с помощью функции ANY_VALUE().

SELECT recipe_id, COUNT(*) AS flavors, ANY_VALUE(flavor_id) AS flavor_id
FROM flavor_recipe
GROUP BY recipe_id
HAVING flavors = 1
0 голосов
/ 11 мая 2018

Ответ Гордона напомнил мне подзапросы. Поэтому я подумал попробовать и нашел решение

SELECT `*`
FROM `flavor_recipe`
WHERE `recipe_id` IN 
   (SELECT `recipe_id` FROM `flavor_recipe` 
   GROUP BY `recipe_id` 
   HAVING COUNT(flavor_id) = 1);

Так просто, я не могу поверить, что раньше не думал о подзапросах .. Спасибо

0 голосов
/ 11 мая 2018

Это может быть более эффективным:

select fr.*
from flavor_recipe fr
where not exists (select 1
                  from flavor_recipe fr2
                  where fr2.recipe_id = fr.recipe_id and fr2.flavor_id <> fr.flavor_id
                 );

В частности, вы хотите индекс для flavor_recipe(recipe_id, flavor_id).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...