如何从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小提琴:
答案 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 / ...生成查询。