有没有一种简单的方法可以将查询中的数字列表与表中的列进行比较,以返回不在数据库中的列?
我有一个逗号分隔的数字列表(1,57,888,99,76,490等),我需要将其与数据库中表格中的数字列进行比较。其中一些数字在表中,有些则不是。我需要查询返回逗号分隔列表中的那些,但不在DB ...
答案 0 :(得分:4)
我会将要检查的数字列表放在他们自己的表中,然后使用WHERE NOT EXISTS
检查它们是否存在于要查询的表中。有关如何实现此目的的示例,请参阅此SQLFiddle demo:
如果您对此语法感到满意,甚至可以避免加入临时表:
SELECT * FROM (
SELECT 1 AS mycolumn
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
UNION
SELECT 5
UNION
SELECT 6
UNION
SELECT 7
) a
WHERE NOT EXISTS ( SELECT 1 FROM mytable b
WHERE b.mycolumn = a.mycolumn )
根据OP的评论更新
如果您可以将很长的数字列表插入表格中,请按以下方式查询以获取在另一个表格中找不到的数字:
SELECT mynumber
FROM mytableof37000numbers a
WHERE NOT EXISTS ( SELECT 1 FROM myothertable b
WHERE b.othernumber = a.mynumber)
可替换地
SELECT mynumber
FROM mytableof37000numbers a
WHERE a.mynumber NOT IN ( SELECT b.othernumber FROM myothertable b )
希望这有帮助。
答案 1 :(得分:1)
可能这就是你要找的东西。
使用CSV
将SUBSTRING_INDEX
转换为行。使用NOT IN
运算符查找DB
然后使用CSV
将结果转换回Group_Concat
。
select group_concat(value) from(
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.a, ',', n.n), ',', -1) value
FROM csv t CROSS JOIN
(
SELECT a.N + b.N * 10 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE n.n <= 1 + (LENGTH(t.a) - LENGTH(REPLACE(t.a, ',', '')))) ou
where value not in (select a from db)
CSV TO ROWS
来自此ANSWER
答案 2 :(得分:-1)
您可以使用&#39; IN&#39; MySQL的子句。也许请查看IN clause tutorial