mysql在查询中查找不在表中的数字

时间:2015-01-10 03:39:36

标签: mysql sql

有没有一种简单的方法可以将查询中的数字列表与表中的列进行比较,以返回不在数据库中的列?

我有一个逗号分隔的数字列表(1,57,888,99,76,490等),我需要将其与数据库中表格中的数字列进行比较。其中一些数字在表中,有些则不是。我需要查询返回逗号分隔列表中的那些,但不在DB ...

3 个答案:

答案 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)

可能这就是你要找的东西。

使用CSVSUBSTRING_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)

SQLFIDDLE DEMO

CSV TO ROWS来自此ANSWER

答案 2 :(得分:-1)

您可以使用&#39; IN&#39; MySQL的子句。也许请查看IN clause tutorial