说我有一个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个数字。
答案 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)
答案 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
。