MySQL:在IN子句中查找缺失值

时间:2018-08-10 13:40:33

标签: mysql

如何从MySQL的IN子句中的项目列表中识别丢失的记录?

提供此数据库:

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

2 个答案:

答案 0 :(得分:1)

取决于您是否愿意使用派生表,无论哪种方式都需要数据存在才能返回它。

 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

答案 1 :(得分:1)

唯一的其他方法是使用像这样的丑陋查询:

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 / ...生成查询。