我有一个产品表,大约有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
答案 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)