SELECT,返回任何行中没有出现的值列表

Riz*_*Riz 31 mysql

查询: __CODE__

如果users表包含id 1,2,3,则返回1,2和3.我想要一个返回4和5的查询.换句话说,我不希望查询返回任何存在的行在表格中,我想给它一个数字列表,并从该列表中获取出现在表格中的值.

(更新以澄清几个不适用的答案之后的问题)

Aus*_*tin 19

如果您不想(显式地)使用临时表,这将起作用:

SELECT id FROM (
  (SELECT 1 AS id) UNION ALL
  (SELECT 2 AS id) UNION ALL
  (SELECT 3 AS id) UNION ALL
  (SELECT 4 AS id) UNION ALL
  (SELECT 5 AS id)
) AS list
LEFT JOIN users USING (id)
WHERE users.id IS NULL
Run Code Online (Sandbox Code Playgroud)

但是,它非常难看,很长,如果ID列表很长,我怀疑它将如何执行.


Bug*_*der 14

鉴于这些数字是一个固定的列表.我能想到的最快的方法是有一个测试表,填充这些数字并做

未经测试的选择声明 - 但您将遵循原则.

select test.number 
from test 
left join 
    users 
on 
    test.number = users.id 
where test.number <> users.id
Run Code Online (Sandbox Code Playgroud)

然后你会收回所有没有匹配user.id的数字,所以可以填补这些漏洞.


Gut*_*ujo 14

有相同的需求,并建立在BugFinder使用会话中的临时表的答案.这样一来,我与查询完成后,它会自动被破坏,所以我没有处理房子的清洁,因为我会经常运行这类查询.

创建临时表:

CREATE TEMPORARY TABLE tmp_table (id INT UNSIGNED);
Run Code Online (Sandbox Code Playgroud)

使用您要检查的值填充tmp_table:

INSERT INTO tmp_table (id) values (1),(2),(3),(4),(5);
Run Code Online (Sandbox Code Playgroud)

创建并填充表后,像使用任何常规表一样运行查询:

SELECT tmp_table.id
  FROM tmp_table
  LEFT JOIN users u
  ON tmp_table.id = u.id
  WHERE u.id IS NULL;
Run Code Online (Sandbox Code Playgroud)

MySQL临时表上的这些信息也很有用