2013-01-01 19 views
3

我有一組值(鍵),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。

+2

這不是重複的鏈接問題,根本就不是 – mvp

回答

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 
+4

@OMGPonies不是我的閱讀 - 給予IN()列表IN(1,2,3,4,5),OP想要值從那個不存在的列表中,不是列表中不存在的行(NOT IN()會返回)。 –

+0

@MichaelBerkowski:道歉 - 你是對的,蛋酒太多了。另一種方法是使用'SELECT 1 UNION ALL SELECT 2 UNION ALL ...'創建一個內聯視圖。 –

1

雖然這是一個非常混亂的解決方案,它的工作:

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) 
); 
1

這是一個有點笨重,但它的工作:

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; 

Obligatory SQL Fiddle.