从一组值中,如何找到未存储在表列中的值?

Cli*_*ton 12 mysql

我有一个表,它可能会存储数十万个整数

desc id_key_table;

+----------------+--------------+------+-----+---------+-------+
| Field          | Type         | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| id_key         | int(16)      | NO   | PRI | NULL    |       |
+----------------+--------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

从程序中,我有一大组整数。我想看看这些整数中哪些不在上面的 id_key 列中。

到目前为止,我提出了以下方法:

1) 遍历每个整数并执行:

select count(*) count from id_key_table where id_key = :id_key
Run Code Online (Sandbox Code Playgroud)

当 count 为 0 时,表中缺少 id_key。

这似乎是一种可怕的、可怕的方式来做到这一点。


2) 创建一个临时表,将每个值插入临时表中,并对两个表执行JOIN。

create temporary table id_key_table_temp (id_key int(16) primary key );

insert into id_key_table_temp values (1),(2),(3),...,(500),(501);

select temp.id_key
from id_key_table_temp temp left join id_key_table as main 
         on temp.id_key = main.id_key 
where main.killID is null;

drop table id_key_table_temp;
Run Code Online (Sandbox Code Playgroud)

这似乎是最好的方法,但是,我确信还有更好的方法我还没有想到。我宁愿不必创建临时表并使用一个查询来确定缺少哪些整数。

这种类型的搜索有正确的查询吗?

(MySQL)

Mic*_*nny 7

您使用 LEFT JOIN 的第二个解决方案是迄今为止最好的方法。我不会使用临时表,我会使用常规表并在您想要运行查询时使用新值填充它。


Lei*_*fel 6

听起来“大整数集”仍然比“数十万整数”表小得多。有了这个假设,除非 MySQL 中有一种方法可以将整数数组用作 SQL 语句中的表,否则您的第二个选择可能是最好的。它应该对临时表和主表上的索引进行全面扫描。主要的好处是它只需扫描包含数十万个整数的索引一次,并且只需将结果发送给客户端。您的查询可以(但不必)改写如下:

SELECT * FROM id_key_table_temp 
WHERE id_key NOT IN (select id_key FROM id_key_table);
Run Code Online (Sandbox Code Playgroud)