我有一組值(鍵),1,2,3,4,5和:獲取值在MySQL表下表存在
id key
------
1 2
2 8
3 4
如果我需要檢查哪些給定的鍵在數據庫中,我使用:
SELECT *
FROM mytable
WHERE key IN (1,2,3,4,5)
所以我會得到與鍵2和4
行是否有某種找出MySQL的方式給定鍵未在數據庫?所以在這種情況下,我想得到1,3,5。
我有一組值(鍵),1,2,3,4,5和:獲取值在MySQL表下表存在
id key
------
1 2
2 8
3 4
如果我需要檢查哪些給定的鍵在數據庫中,我使用:
SELECT *
FROM mytable
WHERE key IN (1,2,3,4,5)
所以我會得到與鍵2和4
行是否有某種找出MySQL的方式給定鍵未在數據庫?所以在這種情況下,我想得到1,3,5。
與你的鑰匙創建臨時表:
CREATE TEMPORARY TABLE mykeys (`key` INT);
INSERT INTO mykeys VALUES (1),(2),(3),(4),(5);
然後不要使用:
SELECT `key`
FROM mykeys
WHERE `key` NOT IN (SELECT `key` FROM mytable)
最後,如果您必須放下您的TEMP表格:
DROP TABLE mykeys
編輯:添加了SQLFiddle。
如果你正在使用PostgreSQL的支持EXCEPT
operator,也VALUES
語句可用於創建行從值的列表中設置,還有另一個更簡單的方法來做到這一點沒有臨時表(SQLFiddle):
VALUES (1),(2),(3),(4),(5)
EXCEPT
SELECT key FROM mytable
@OMGPonies不是我的閱讀 - 給予IN()列表IN(1,2,3,4,5),OP想要值從那個不存在的列表中,不是列表中不存在的行(NOT IN()會返回)。 –
@MichaelBerkowski:道歉 - 你是對的,蛋酒太多了。另一種方法是使用'SELECT 1 UNION ALL SELECT 2 UNION ALL ...'創建一個內聯視圖。 –
雖然這是一個非常混亂的解決方案,它的工作:
select v.val from
(
select 1 as val
union
select 2 as val
union
select 3 as val
union
select 4 as val
union
select 5 as val
) v
WHERE
v.val NOT IN(
SELECT `key`
FROM mytable
WHERE key IN (1,2,3,4,5)
);
這是一個有點笨重,但它的工作:
select sq.val
from mytable t
right join (select 1 as val
union
select 2
union
select 3
union
select 4
union
select 5) as sq
on t.col = sq.val
where t.id is null;
這不是重複的鏈接問題,根本就不是 – mvp