2009-07-08 25 views
2

這已經快把我逼瘋了過去幾分鐘MySQL中,給定一個列表,從表中

我有一個表中選擇缺少的行,可以說table_alphabet有三列。

letter(pri) col1 col2 
a   24  55 
b   45  45 
c   23  44 
... 
y   33  55 
z   45  22 

現在在我的應用我有一個列表( 'A', 'B', '笑', '貓', 'Z', '富')。

如果我做

SELECT letter FROM table_alphabet WHERE letter IN ('a', 'b', 'lol', 'cats', 'z', 'foo') 

我只得到了行(A,B,Z)

我想雖然是得到 '笑', '貓', '富'。或者用英文,表中缺少我列表中的哪些項目。

任何幫助將不勝感激,今天我似乎有一個大腦故障。

回答

-3

即使使用您要過濾的非靜態列表,NOT IN命令也能正常工作。你可以使用一個子查詢,如:

select letter from table_alphabet where letter NOT IN (select letter from exclude_table) 
+0

貌似我通過做某種表 – 2009-07-08 21:37:21

+1

的這是不對的,它會給你別無選擇table_alphabet表中不在exclude_table中的字母(在上例中,c,y) – 2009-07-10 12:56:59

0

我可能是完全離開基地,但我不認爲你會在只有SQL單獨實現。

現在,如果您將列表加載到表中,請將其稱爲table_list,然後將它加入到table_alphabet中,並排除字母爲空的所有行,然後您可以獲取排除列表。

0

對不起,我第一次徹底誤讀了這個問題。您需要一個可以將列表中的所有字母作爲行拖動的子查詢。我能想到這樣做的唯一方法是UNIONing它們放在一起:

select let from (select 'a' as let union select 'b' as let union select 'lol' as let union select 'cats' as let union select 'z' as let union select 'foo' as let) as innerletters where let not in (select letter from table_alphabet); 
換句話說

所以,你的應用程序將需要採取列表「('a', 'b', 'lol', 'cats', 'z', 'foo')」,並在UNION重寫一遍:

(select 'a' as let union select 'b' as let union select 'lol' as let union select 'cats' as let union select 'z' as let union select 'foo' as let) 

...並將其插入到查詢中。這應返回從列表中是不存在的table_alphabet表的函列的字母:

+------+ 
| let | 
+------+ 
| lol | 
| cats | 
| z | 
| foo | 
+------+