使用SELECT NOT IN查找不存在的ID?

时间:2012-11-28 14:16:27

标签: php mysql

我有一个ID列表,逗号分隔存储为字符串。

123456789

我之前使用过这样的东西为每个ID存在的数据库中的每一行提取数据:

SELECT id, name FROM line_item WHERE id IN (123,456,789)

但是,我只想确定数据库中不存在的ID。例如。检查表格以返回DB中不存在的所有ID。

我尝试NOT IN假设它会起作用,但当然,我得到的只是每个与我的样本不匹配的ID,这是大量的(数千行,我们通常需要检查的少量ID)对)。

SELECT id FROM line_item WHERE id NOT IN (123,456,789)

例如:

表:ID

111
222
333
444
555
777
999

字符串:

111,222,666,888,999

查询应返回:

666,888

使用MySQL,我可以在不使用PHP的情况下找到那些不存在的值。

3 个答案:

答案 0 :(得分:4)

您可以创建使用所需id值填充的其他表,并将查询与LEFT JOIN和WHERE子句一起使用 -

CREATE TABLE temp_table(id INT);
INSERT INTO temp_table VALUES(123),(456),(789);

SELECT t1.id FROM temp_table t1
  LEFT JOIN line_item t2
    ON t1.id = t2.id
WHERE t2.id IS NULL;

另一种变体:

SELECT t1.id FROM (SELECT 123 id UNION SELECT 456 UNION SELECT 789) t1
  LEFT JOIN line_item t2
    ON t1.id = t2.id
WHERE t2.id IS NULL;

答案 1 :(得分:0)

NOT IN将获取括号中的值并导致查询,如您所说,为您提供所有其他ID。

我不知道是否有办法同时使用多个数字进行此操作 - 但这就是你用一个方法做到的方法:

SELECT id, name, description
FROM line_item
WHERE 1 NOT IN (SELECT id FROM line_item) // Replace 1 with your numbers in a loop

答案 2 :(得分:0)

在Postgresql上,您可以使用generate_series(i,j)功能。例如,要查找id列中不存在的整数,您可以写:

select i from generate_series(
    (select min(id) from line_item),(select max(id) from line_item)
) as i 
where i not in (select id from line_item);

如果要使用此查询查找要用作id的第一个可用整数,可以使用此查询:

select min(i) from generate_series(
    (select min(id) from line_item),(select max(id) from line_item)+1
) as i 
where i not in (select id from line_item);