有一张表有这些数据
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
答案 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);