3

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

123,456,789

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

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

但是,我只想确定它们在数据库中不存在的 ID。例如,检查表以返回数据库中不存在的所有 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 的情况下找到那些不存在的值吗?

4

3 回答 3

6

您可以创建填充有所需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;
于 2012-11-28T14:24:26.997 回答
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
于 2012-11-28T14:24:28.163 回答
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);
于 2015-05-07T07:39:55.783 回答