MySQL - 确定存在于给定列表但不存在于表中的数据

标签 mysql sql

我有一张表 my_tab :

+--------+
| tab_id |
+--------+
|    1   |
|    2   |
|   ...  |
|   50   |
|   56   |
|   100  |
+--------+

*注意我没有tab_id = 51, 52, 53, 54 or 55

现在,我有一个 ID 列表。 1, 2, 3, 4, ..., 50, 51, 52, 53, 54, 55, 56, ..., 100

我想知道表 my_tab 中不存在 ID 列表中的哪个 ID。 我的意思是,所需的输出应该是 51、52、53、54 和 55

我考虑过使用一个临时表,将 list 存储在其中,然后使用 my_tab 执行 Left JOIN

但是,我无权这样做(只读权限)。

最佳答案

want to know wich id of the list of IDs does not exist in the table my_tab. I mean, the desired output should be 51, 52, 53, 54 and 55.

我假设当前数据示例和数字列表所需的输出是

| number |
|--------|
|      3 |
|      4 |
|     51 |
|     52 |
|     53 |
|     54 |
|     55 | 

如您所见,此查询允许数字列表和表格数据中存在间隙。

查询

SELECT  
 number_list.number
FROM (

  SELECT 
   1 AS number
  UNION 
   SELECT 
     2 AS number   
  UNION
  SELECT 
   3 AS number
  UNION 
  SELECT 
     4 AS number 
  # ...
  # ...
  UNION
  SELECT 
    50 AS number
  UNION 
  SELECT 
    51 AS number 
  UNION
  SELECT 
    52 AS number
  UNION 
  SELECT 
    53 AS number 
  UNION
  SELECT 
    54 AS number
  UNION 
  SELECT 
    55 AS number 
  UNION
  SELECT 
    56 AS number
  UNION 
  # ...
  # ...  
  SELECT 
    100 AS number 

) AS number_list
LEFT JOIN 
 Table1
ON
 number_list.number = Table1.tab_id
WHERE
  Table1.tab_id IS NULL

结果

| number |
|--------|
|      3 |
|      4 |
|     51 |
|     52 |
|     53 |
|     54 |
|     55 |

查看演示 http://sqlfiddle.com/#!9/31956e/13

更新因为评论关闭。

Don't you think if number list goes up to 1000, it's almost impossible to generate a list by using only Select or up to 10000 in any case about which I am pretty sure it will.

更动态的查询需要 MySQL 数字生成器和嵌套的子索引函数才能工作。

生成数字 1 到 100 的数字生成器查询。
因此查询仅适用于最多 100 个号码的号码列表。
如果您需要更多,只需添加一个新的

CROSS JOIN ( SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 ) AS record_<number>

查询

SELECT 
 (@row_number := @row_number + 1) AS row_number
FROM (
 SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) AS record_1
CROSS JOIN (
 SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) AS record_2
CROSS JOIN (SELECT @row_number := 0) AS init_user_param

查看演示 http://sqlfiddle.com/#!9/31956e

使用嵌套 SUBSTRING_INDEX在 MySQL 中从字符串中拆分项目的函数。

查询

SELECT  
 SUBSTRING_INDEX(
   SUBSTRING_INDEX(
      '1,2,3,4,50,51,52,53,54,55,56,100'
     ,',', 1
   )
   , ','
   , -1
 ) AS number

查看演示 http://sqlfiddle.com/#!9/340e01/528

使用这两种方法并获得您需要的结果。

查询

SELECT 
 number_list.number
FROM ( 

  SELECT
   DISTINCT 
   SUBSTRING_INDEX(
     SUBSTRING_INDEX(
        '1,2,3,4,50,51,52,53,54,55,56,100' #this is the number list
       ,',', number_generator.row_number
     )
     , ','
     , -1
 ) AS number
  FROM ( 
    SELECT 
     (@row_number := @row_number + 1) AS row_number
    FROM (
     SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
    ) AS record_1
    CROSS JOIN (
     SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
    ) AS record_2
    CROSS JOIN (SELECT @row_number := 0) AS init_user_param
  ) AS number_generator 
) AS number_list
LEFT JOIN 
 Table1
ON
 number_list.number = Table1.tab_id
WHERE
  Table1.tab_id IS NULL

查看演示 http://sqlfiddle.com/#!9/31956e/35

关于MySQL - 确定存在于给定列表但不存在于表中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52005335/

相关文章:

mysql - 在 Laravel 的 Eloquent 或普通 SQL 中计数点

mysql - 如何合并这两个 MySQL 查询

sql - 如何在postgresql/sql中查询对数组字段的订阅

mysql - 将两个复杂的 SQL 语句合并为一个

mysql - 如何在Dockerfile中将Mysql Docker连接到其他docker?

java - JDBC 删除数据库中具有特定时间戳的行

sql - SQL编译错误: syntax error line 5 at position 157 unexpected '<EOF>'

mysql - 从多个表中选择值,其中 value = X

SQL Server 存储过程在进行微小更改后需要很长时间才能运行

php - 我应该使用什么 where 子句来获取大于创建日期的对象?