Mysql: найти недостающие значения в предложении in

Как определить недостающие записи из списка элементов в предложении IN в MySQL?

Учитывая эту БД:

CREATE TABLE IF NOT EXISTS `animals` (
  `id` int(2) unsigned NOT NULL,
  `name` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `animals` (`id`, `name`) VALUES
  ('1', 'dog'),
  ('2', 'mouse'),
  ('3', 'cat'),
  ('4', 'snail');

Используя такой запрос:

... NOT IN ("horse", "donkey", "dog");

Должен вернуться:

"horse", "donkey"

Возможно ли это даже в MySQL без создания новой временной таблицы с элементами в предложении IN?

Конечно, я могу использовать множество языков программирования (или даже таблицы / формулы Excel), чтобы получить недостающие результаты, но я ищу простой / довольно собственный метод MySQL (если он существует).

Скрипка SQL:

http://sqlfiddle.com/#!9/24eac7/3

Как он должен вернуть "horse", "donkey"? Он просто вернет то, что говорит запрос, NOT IN ("horse", "donkey", "dog") означает mouse,cat,snail.

Susang 10.08.2018 15:50

Я думаю, вместо того, чтобы смотреть на то, чего нет в вашем массиве имен, вы можете получить имена, которые действительно существуют, а затем в своем коде перебрать массив имен для тех, которых не существует, если вам не нужна временная таблица.

karen 10.08.2018 15:56
1
2
188
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Зависит от того, хотите ли вы использовать производную таблицу, независимо от того, каким образом вам нужны данные, чтобы их вернуть.

 SELECT b.name FROM
 (
SELECT 'dog' name
UNION SELECT 'horse'
UNION SELECT 'donkey'
 ) b
LEFT JOIN animals a ON a.name = b.name
WHERE
  a.Name IS NULL

Спасибо, но это некрасиво и будет еще хуже, если записи в предложении IN будут большими.

numediaweb 10.08.2018 16:14

Это единственный способ, который я могу придумать для MySQL, очиститель был в MSSQL или Postgres с использованием синтаксиса VALUES () для внутреннего соединения.

Chriz 10.08.2018 16:43

@numediaweb Реляционные базы данных предназначены для хранения и поиска данных. Итак, вам нужно выбирать между хранением данных и «некрасивым» запросом.

Strawberry 10.08.2018 16:48

Единственный другой способ - использовать такой уродливый запрос:

SELECT DISTINCT list.name FROM (
  (SELECT 'horse' AS name) UNION ALL
  (SELECT 'donkey' AS name) UNION ALL
  (SELECT 'dog' AS id)
) AS list
LEFT JOIN animals ON list.name = animals.name
WHERE animals.name IS NULL

Вы можете использовать PHP / Python / ... для генерации запроса.

Спасибо, но я ищу что-то родное для MySQL.

numediaweb 10.08.2018 16:14

AFAIK, решения нет. Причина проста. SQL обрабатывает данные таблицы и дает определенный результат. Если в ЛЮБЫХ таблицах НЕТ значений, их просто невозможно получить в результате.

Ildar Akhmetov 10.08.2018 16:22

Другие вопросы по теме