获取表中不存在的ID列表

时间:2013-04-11 13:30:10

标签: mysql arrays select

说我有一个id列表,例如(1,3,9,2,4,86)和一个列id的表。我想查找列表中没有匹配行的所有数字。

即。如果mysql表是这样的:

id  letter
1   a
2   b
3   c
4   d
5   e
6   f
7   g

我有列表(1, 3, 9, 2, 4, 86),我想要一个返回(9, 86)的查询。

我唯一能想到的是构建一个非常大的虚拟表,例如:

select 1 as n union select 3 as n union select 9 as n union ....

然后我可以加入反对。有没有更好的办法?我希望能够在mysql中完成所有这些。作为旁注(尽管我不希望它相关),我的表格大约有10,000行,我使用的列表中有大约100个数字。

3 个答案:

答案 0 :(得分:2)

您必须先create一个包含 LIST

元素的表格

(1, 3, 9, 2, 4, 86)

create table t
(
    num int
)
insert into t
values
(1),(3),(9),(2),(4),(86)

现在您可以使用NOT IN

SELECT num
FROM t
WHERE num not in (select id from letter_table);

<强> SQL Fiddle

来自评论 修改

的方式有create表格

select N from
(select 1 as N
union all
select 3 as N
union all
select 9 as N
union all
select 2 as N
union all
select 4  as N
union all
select 86 as  N)t1
where t1.N
not in (select id from letter_table)

请参阅 New SQL Fiddle

我认为OP想要已编辑部分。

P.S。确保您的数据库中不存在确定表t1

答案 1 :(得分:0)

创建一个包含ID的表,而且您可以轻松地执行此操作。看这里的演示

SELECT
  S.id,
  ''   AS `letter`
FROM sequence S
WHERE S.id NOT IN(SELECT
                    id
                  FROM mytable)

SQL Fiddle Demo

答案 2 :(得分:0)

假设您在@Luv的答案中使用临时表或UNION方法,请考虑将NOT IN替换为外连接,因为它可能表现更好(使用您的实际环境和数据进行测试)当然):

SELECT num
FROM t
    LEFT OUTER JOIN letter_table
        ON t.num = letter_table.id
WHERE letter_table.id IS NULL;

如果您使用UNION方法,请将FROM t替换为FROM ([big UNION here]) t