如何过滤表的非存在id

时间:2016-03-24 14:21:53

标签: mysql

有一张表有这些数据

select * from t;
+----+------+
| id | name |
+----+------+
|  1 | a    |
|  2 | b    |
|  3 | c    |
|  4 | d    |
|  5 | e    |
|  6 | f    |
+----+------+

现在我有一个id列表,我想得到这个表中不存在的,我想要的效果是这样的

select non_exist(id) from t where id in (1,2,5,7,10)
7
10

那么如果mysql有一些方便的功能可以支持这个要求吗?

现在我的方式是

 cat all_id
 1
 2
 5
 7
 10

cat all_id | tr '\n' ','|awk '{gsub(/,$/,"");print "mysql -uroot -p123456 test -e '\''select id from t where id in ("$0");'\''"}'|bash>exist_id

cat exist_id 
id 
1
2
5
comm <(sort all_id) <(sort exist_id) -2 -3 
10
7

2 个答案:

答案 0 :(得分:1)

MySQL中没有这样的功能。你必须建立一个包含所有id的内联表,然后LEFT JOIN你的表:

SELECT x.v
FROM (
   SELECT 1 AS v UNION ALL SELECT 2 UNION ALL SELECT 5 UNION ALL
   SELECT 7 UNION ALL SELECT 10) AS x
LEFT JOIN t ON x.v = t.id
WHERE t.id IS NULL

谓词t.id IS NULL检测到不匹配的ID。

答案 1 :(得分:0)

创建临时表可能是实现它的一种方式......

CREATE TEMPORARY TABLE tempy (id INT);
INSERT INTO tempy values (1),(2),(5),(7),(10);
select id from tempy WHERE id NOT IN (select id from t);