代码之家  ›  专栏  ›  技术社区  ›  Janne

使用多个in语句但不使用笛卡尔积的查询

  •  3
  • Janne  · 技术社区  · 14 年前

    我如何在mysql中进行这种查询

    SELECT * FROM Table t 
    WHERE t.a IN (1,2,3) 
    AND t.b IN (4,5,6) 
    AND t.c IN (7,8,9) ...
    

    因此结果将只包含三行:

    t.a|t.b|t.c
    ---+---+---
     1 | 4 | 7
     2 | 5 | 8
     3 | 6 | 9
    

    当然,上面的查询返回in子句中所有值的组合,但我希望 只获取每个元组的第一个元素匹配的元素,每个元组的第二个元素匹配的元素,等等 .

    有什么有效的方法可以做到这一点吗?

    顺便问一下,这类查询或概念有什么通用术语吗?我很难想出这个问题的题目,因为我无法用语言表达。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Quassnoi    14 年前
    SELECT  *
    FROM    mytable
    WHERE   (a, b, c) IN ((1, 4, 7), (2, 5, 8), (3, 6, 9))
    

    ,或更方便索引的解决方案:

    SELECT  *
    FROM    mytable
    WHERE   (a, b, c)  = (1, 4, 7)
            OR (a, b, c)  = (2, 5, 8)
            OR (a, b, c)  = (3, 6, 9)
    

    不幸的是, MySQL 中的记录类型不使用索引。 IN 条款。

        2
  •  3
  •   Blorgbeard    14 年前

    在MSSQL中,可以执行以下操作:

    SELECT * FROM Table t 
    join (
            select 1 a, 2 b, 3 c
      union select 4 a, 5 b, 6 c
      union select 7 a, 8 b, 9 c
    ) x on t.a=x.a and t.b=x.b and t.c=x.c
    

    我不确定这是否会直接翻译成mysql。

    当然,更简单的方法是:

    SELECT * FROM Table t 
    WHERE (t.a=1 and t.b=4 and t.c=7)
       or (t.a=2 and t.b=5 and t.c=8)
       or (t.a=3 and t.b=6 and t.c=9)
    
        3
  •  0
  •   D'Arcy Rittich    14 年前
    select t1.a, t2.b, t3.c
    from Table t1
    inner join Table t2 on (t1.a = 1 and t2.b = 4) or (t1.a = 2 and t2.b = 5) or (t1.a = 3 and t2.b = 6)  
    inner join Table t3 on (t2.b = 4 and t3.c = 7) or (t2.b = 5 and t3.c = 8) or (t2.b = 6 and t3.c = 9)