Убрать лишнее подзапросом

174
23 июля 2019, 14:00

Помогите пожалуйста понять, как сделать выборку в задаче:
Есть таблица (извините, туповато выглядит, но ничего умнее не придумалось).

Нужно найти животных, которые не едят аллергичную еду
Если я делаю вот такую выборку, то вываливаются все строки, исключая аллергичные продукты, но мне нужно исключить животных, которые могут их есть (т.е. в итоге должен остаться только лось)

SELECT д.animal
FROM диета д
join цвет ц on д.meal = ц.meal
join аллергия а on a.color = ц.color
where а.allergy not in ('да')

И я совсем не понимаю, как составить запрос (подзапрос), чтобы исключить самих животных.

Answer 1

Вот пример

select * from exampl_diet d1 
where d1.animal not in(
    -- Получаем список всех животных которые могут есть аллергенные продукты
    select distinct d.animal from exampl_diet d
    where d.meal in (
        -- Получаем список всех аллергенных продуктов
        select meal from exampl_color c, exampl_allergy a 
        where c.color=a.color and a.allergy = 'да' 
    )
)

структуры таблиц для примера

CREATE TABLE `exampl_allergy` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `color` varchar(45) DEFAULT NULL,
  `allergy` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
)
CREATE TABLE `exampl_color` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `meal` varchar(45) DEFAULT NULL,
  `color` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
)
CREATE TABLE `exampl_diet` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `animal` varchar(45) DEFAULT NULL,
  `meal` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
)
Answer 2

Я сначала внешние ключи настроил

SELECT animal_meal.animal
FROM animal_meal
INNER JOIN color_meal ON color_meal.meal = animal_meal.meal
INNER JOIN allergy_color ON allergy_color.color = color_meal.color
GROUP BY animal_meal.animal
HAVING GROUP_CONCAT(DISTINCT allergy_color.allergy) = 'нет'
Answer 3

Попробуйте такой вариант, он должен работать:

SELECT DISTINCT д.animal
FROM диета д
LEFT JOIN цвет ц on д.meal = ц.meal
LEFT JOIN аллергия а on a.color = ц.color
WHERE а.allergy = 'нет'

Хотя если Вы дополнительно избавитесь от кириллицы в именах таблиц, это будет очень правильное решение.

READ ALSO
ошибка добавление в MySQL

ошибка добавление в MySQL

парсю информацию с каналов телеграм, и необходимо добавить в базу данных MySQL спарсенные значенияПроблема возникает с этой строчкой:

130
Семантические теги header, main, footer

Семантические теги header, main, footer

Допускается ли использование тегов (header, main, footer) по отдельности? Например на странице будет присутствовать main и footer, но отсутствовать headerИли...

142
Верстка карточки пользователя

Верстка карточки пользователя

Всем доброго вечере! Подскажите пожалуйста как сверстать этот элемент слайдера(фото прикрепила)Ситуация следующая, при наведение мишки...

155