我有一组值(键)、1、2、3、4、5 和下表:
id key
------
1 2
2 8
3 4
如果我需要检查哪些给定的键在 db 中,我使用:
SELECT *
FROM mytable
WHERE key IN (1,2,3,4,5)
所以我会得到带有键 2 和 4 的行。
是否有某种 mysql 方法可以找出哪些给定键不在数据库中?所以在这种情况下,我想得到 1,3,5。
使用您的密钥创建临时表:
CREATE TEMPORARY TABLE mykeys (`key` INT);
INSERT INTO mykeys VALUES (1),(2),(3),(4),(5);
然后使用 NOT IN:
SELECT `key`
FROM mykeys
WHERE `key` NOT IN (SELECT `key` FROM mytable)
最后,如果必须,请删除 TEMP 表:
DROP TABLE mykeys
编辑:添加了 SQLFiddle。
如果您使用的是支持EXCEPT
operator的 PostgreSQL ,并且VALUES
语句可用于从值列表创建行集,则还有另一种更简单的方法可以在没有临时表 ( SQLFiddle ) 的情况下执行此操作:
VALUES (1),(2),(3),(4),(5)
EXCEPT
SELECT key FROM mytable
虽然这是一个非常混乱的解决方案,但它确实有效:
select v.val from
(
select 1 as val
union
select 2 as val
union
select 3 as val
union
select 4 as val
union
select 5 as val
) v
WHERE
v.val NOT IN(
SELECT `key`
FROM mytable
WHERE key IN (1,2,3,4,5)
);
这有点笨拙,但确实有效:
select sq.val
from mytable t
right join (select 1 as val
union
select 2
union
select 3
union
select 4
union
select 5 ) as sq
on t.col = sq.val
where t.id is null;