代码之家  ›  专栏  ›  技术社区  ›  The Unknown

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

  •  2
  • The Unknown  · 技术社区  · 15 年前

    这几分钟来一直让我发疯

    我有一张桌子,让我们说三列的表格字母表。

    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 回复  |  直到 15 年前
        1
  •  -3
  •   Martin Dale Lyness    15 年前

    not in命令甚至可以与您筛选的非静态列表一起使用。您可以使用如下子查询:

    select letter from table_alphabet where letter NOT IN ( select letter from exclude_table )
    
        2
  •  0
  •   Peter Lange    15 年前

    我可能完全没有根据,但我不认为你只需要SQL就可以实现这一点。

    现在,如果您将列表加载到一个表中,将其称为表\列表,然后左键将其连接到表\字母表并排除字母表为空的所有行,那么您可以获得排除列表。

        3
  •  0
  •   Adam Batkin    15 年前

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

    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') “在一个联合体中重写它:

    (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)
    

    …并将其插入到查询中。这将返回表“字母表”的“字母”列中不存在的列表中的字母:

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