查找不属于列表的ID

时间:2014-02-17 19:06:43

标签: mysql sql

我有一个产品表,大约有6万种产品。我有一个大约2k ID的字符串格式列表。我希望能够选择产品表中不存在的列表的ID。

我可以创建一个临时表,将所有ID添加到它,然后将它连接到产品表上以找出哪个ID不存在但我相信只有一个查询就有更简单的方法。

以下是问题的简化版本:

| Products |
|----------|
|id | ...  |
|1  |      |
|2  |      |
|3  |      |
|5  |      |
------------    

List of ID : 2,3,4

我希望得到结果4

理想情况下,我想做一个这样的查询:

SELECT * FROM (2,3,4) ids
LEFT OUTER JOIN products 
ON ids.id = products.id 
HAVING products.id IS NULL

2 个答案:

答案 0 :(得分:1)

如果您打算使用该类型解决方案,我会将其重写为:

SELECT ids.id 
FROM (SELECT 2 AS id
      UNION
      SELECT 3
      UNION
      SELECT 4) AS ids
LEFT OUTER JOIN products 
 ON ids.id = products.id 
WHERE products.id IS NULL

答案 1 :(得分:0)

棘手的部分是将您划分的值列表(在一行上)转换为多行。为此我相信你应该使用自定义功能。这是你可以使用的一个:

第1步:自定义功能

CREATE FUNCTION strsplit(x varchar(255), delim varchar(12), pos int) returns varchar(255)
return replace(substring(substring_index(x, delim, pos), length(substring_index(x, delim, pos - 1)) + 1), delim, '');

取自:http://dev.mysql.com/doc/refman/5.1/en/string-functions.html

第2步:创建“数字”表

您说您在搜索时使用的分隔列表中有2,000条记录。获取确切的数字,并创建一个“数字”表,但行数从1,2,3等开始,直到您要搜索的许多ID。因此,如果您正在搜索2,335个ID,请打开Excel,创建一个从1到2,335的列表,并将其作为一个列表导入。注意:此表只需要有一个升序的数字列表,它与您要搜索的ID无关,它只需要为您要搜索的每个ID都有一行,并且有一个递增计数。 (参考sql小提琴示例)。因为它不是你的搜索列表而且只是一系列连续的#s,你应该能够在Excel中轻松地完成这项工作,然后通过phpmyadmin导入。

第3步:使用自定义函数和“数字”表

运行查询
select strsplit(ids.id, ',', numbers.numbers) as missing
  from ids, numbers
 where ids.id not in (select id from products)

SQL小提琴: http://sqlfiddle.com/#!2/d8282/3/0