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