MySQL,给定一个列表,从表中选择缺少的行

时间:2009-07-08 19:31:56

标签: mysql select where-in

过去几分钟,这让我发疯了

我有一张桌子,让我们说table_alphabet有三列。

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

现在我的应用程序中有一个列表('a','b','lol','cats','z','foo')。

如果我这样做

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

我只获得行,(a,b,z)

我想要的是获得'lol','cats','foo'。或者用英语,表中缺少列表中的哪些项目。

任何帮助将不胜感激,我今天似乎有脑功能障碍。

3 个答案:

答案 0 :(得分:0)

我可能完全偏离基础,但我不认为你只会在SQL中实现这一目标。

现在,如果您将列表加载到表中,请将其命名为table_list,然后将其连接到table_alphabet并排除字母为null的所有行,然后您就可以获得排除列表。

答案 1 :(得分:0)

对不起,我第一次完全误解了这个问题。您将需要一个子查询,可以将列表中的所有字母作为行。我能想到的唯一方法是将它们全部联合起来:

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

答案 2 :(得分:-3)

即使使用您要过滤的非静态列表,NOT IN命令也能正常工作。您可以使用以下子查询:

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