我有一个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的情况下找到那些不存在的值。
答案 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);