3

我有一组值(键)、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。

4

3 回答 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


如果您使用的是支持EXCEPToperator的 PostgreSQL ,并且VALUES语句可用于从值列表创建行集,则还有另一种更简单的方法可以在没有临时表 ( SQLFiddle ) 的情况下执行此操作:

VALUES (1),(2),(3),(4),(5)
EXCEPT
SELECT key FROM mytable
于 2013-01-01T23:00:37.550 回答
1

虽然这是一个非常混乱的解决方案,但它确实有效:

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)
);
于 2013-01-01T22:55:25.507 回答
1

这有点笨拙,但确实有效:

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;

强制性的 SQL 小提琴。

于 2013-01-01T23:18:00.517 回答