首页 > 解决方案 > 使用mysql查询从给定数据中获取不可用的数据

问题描述

我需要查询:

例如:'1','2','9','10','3','4','5','6','7','8';

表名:getstdata

    ID
    1
    2
    3
    4
    5
    5
    7
    

询问:

select ID from getstdata where ID in('1','2','9','10','3','4','5','6','7','8')

结果:

'1','2','3','4','5','6','7'
    

在上述数据中 8,9,10 不在数据中。我需要那个不可用的数据。请给我解决方案。

谢谢

标签: mysql

解决方案


Akina 的意思是从查询中创建一个临时表,因为您没有存储所有信息的现有表(我在评论中忽略的问题建议)。

所以你有一个表getstdata,你想得到一个从 1 到 10 的数字范围的例子,它在 tableID列中不存在,然后你制作一个临时表来存储 1 到 10 个数字的范围,如下所示:

SELECT 1 AS T 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;

这会给你这个结果:

+-----+
| T   |
+-----+
| 1   |
| 2   |
| 3   |
| 4   |
| 5   |
| 6   |
| 7   |
| 8   |
| 9   |
| 10  |
+-----+

然后你把它作为一个子查询并像这样LEFT JOIN对你的getstdata表做一个:

SELECT * FROM
    (SELECT 1 AS T 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) A 
LEFT JOIN getstdata B ON A.T=B.ID;

这会给你这样的东西:

+-----+------+
| T   | ID   |
+-----+------+
| 1   |  1   |
| 2   |  2   |
| 3   |  3   |
| 4   |  4   |
| 5   |  5   |
| 6   |  6   |
| 7   |  7   |
| 8   | NULL |
| 9   | NULL |
| 10  | NULL |
+-----+------+

在上面的结果中,NULL值就是您要查找的值。因此,您可以将查询细化为如下所示:

SELECT A.T FROM
    (SELECT 1 AS T 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) A 
LEFT JOIN getstdata B ON A.T=B.ID
    WHERE B.ID IS NULL;

这个最终结果:

+-----+
| T   |
+-----+
| 8   |
| 9   |
| 10  |
+-----+

如您所见,这是解决当前问题的快速方法,但如果您进行的比较不是数字怎么办?如果数字范围从 1 到 1000 怎么办?你愿意写成SELECT 1 UNION SELECT 2 UNION ... all the way to ... SELECT 999 UNION SELECT 1000;子查询吗?但是如果您使用的是 MariaDB 10.0.3 及更高版本,您可以使用它的内置序列引擎轻松制作一系列数字。

*一个使用序列引擎的快速 MariaDB 示例:

SELECT A.T FROM 
    (SELECT Seq AS T FROM seq_1_to_10) A 
LEFT JOIN getstdata B ON A.T=B.ID 
WHERE B.ID IS NULL;

不过,这只是比较数字的解决方案。在这里拉小提琴


推荐阅读