Mysql 从预定义列表中选择“不在”

Mysql 从预定义列表中选择“不在”,mysql,sql,Mysql,Sql,为了简单起见,假设我有一个以id作为主键的表事务。目前,表中只有10行id为1到10 我有一个ID列表:{9,10,11,12}。此列表未存储在数据库中 我想在数据库中查询不在事务表中的ID。在上面的例子中,我想得到11,12 编写此查询的最佳方式是什么 目前我只是从9,10,11,12中id所在的事务中查询SELECT*。在代码中进行交集。我想知道的是,我可以在SQL中一步完成这一切。您可以使用包含ID的子查询来完成这项工作。这里有一个方法: select ids.id from (selec

为了简单起见,假设我有一个以id作为主键的表事务。目前,表中只有10行id为1到10

我有一个ID列表:{9,10,11,12}。此列表未存储在数据库中

我想在数据库中查询不在事务表中的ID。在上面的例子中,我想得到11,12

编写此查询的最佳方式是什么


目前我只是从9,10,11,12中id所在的事务中查询SELECT*。在代码中进行交集。我想知道的是,我可以在SQL中一步完成这一切。

您可以使用包含ID的子查询来完成这项工作。这里有一个方法:

select ids.id
from (select 9 as id union all select 10 union all select 11 union all select 12
     ) ids
where not exists (select 1 from transactions t where t.id = ids.id);

从一个名为transactions的表返回行似乎效率低下——太多的数据来回传输,无法满足您的需要。虽然只有10行,但这对数据大小来说并不是什么大问题。

另一种方法是使用子句。比如,

select 9 as id union all select 10 union all select 11 union all select 12
except select id from transactions

创建一个具有要匹配的id值的表。将该表用作左联接的外部表。Gordon的答案和我的一样。为什么不从id不在9,10,11,12中的事务中选择*呢?因为您要选择的数据在表中不可用。你永远不会得到11或12,因为它不存在。对于不在该表中的ID,有任何参考或限制吗?我之所以这么问是因为ID不是一个趋向于无限的句子。任何自然数>10的查询都会显示在我的慢速查询日志中。也许我应该使用记忆表。