2

假设我有一个 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 个数字。

4

3 回答 3

3

您必须首先create包含一个包含LIST元素的表

IE(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小提琴

来自评论编辑:

有一种方法可以让您不必坐在桌子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想要的是编辑部分。

PS确保您的数据库中不存在表t1

于 2013-04-11T13:48:41.207 回答
1

创建一个包含 ID 的表,并且您可以轻松地做到这一点。在此处查看演示

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

SQL 小提琴演示

于 2013-04-11T13:50:08.990 回答
0

假设您使用临时表或UNION@Luv 的答案中的方法,请考虑用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 tFROM ([big UNION here]) t.

于 2013-04-11T14:49:42.320 回答