在mysql的'WHERE'子句中评估多个'IN'表达式

Ces*_*sar 8 mysql sql evaluation where-clause

@Cesar要求更新.希望我明白你想要什么,如果没有,请恢复.Quassnoi.

如果我这样做一个SQL查询:SELECT * FROM TABLE_NAME WHERE b IN (2, 7) AND c IN (3, 9),我可以假设MySQL只匹配每个列表中具有相同编号的元素的对吗?

也就是说,(2, 3),(7, 9),...?

例如,假设我们有一个这样的表:

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     1    |     2    |     3    |
 +----------+----------+----------+
 |     2    |     5    |     4    |
 +----------+----------+----------+
 |     3    |     7    |     9    |
 +----------+----------+----------+
 |     4    |     7    |     4    |
 +----------+----------+----------+
 |     5    |     2    |     9    |
 +----------+----------+----------+

假设返回的唯一行是13(而不是5),这是正确的吗?

Qua*_*noi 22

SELECT * FROM TABLE_NAME WHERE b IN(5,7) AND c IN(4,4)
Run Code Online (Sandbox Code Playgroud)

这个查询将返回行,其中b要么是57,和c4.

"成对评价"是什么意思?

更新:

我将在示例中再添加一行:

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     1    |     2    |     3    |
 +----------+----------+----------+
 |     2    |     5    |     4    |
 +----------+----------+----------+
 |     3    |     7    |     9    |
 +----------+----------+----------+
 |     4    |     7    |     4    |
 +----------+----------+----------+
 |     5    |     2    |     9    |
 +----------+----------+----------+
Run Code Online (Sandbox Code Playgroud)

如果要匹配整个集,可以使用以下语法:

SELECT  *
FROM    table_name
WHERE   (b, c) IN ((2, 3), (7, 9))
Run Code Online (Sandbox Code Playgroud)

这意味着:"返回所有行b2c3在同一时间,或者b7?9在同一时间."

在上面的示例中,此查询将返回行13

但是如果你反过来重写这个查询,就像这样:

SELECT  *
FROM    table_name
WHERE   b IN (2, 7)
        AND c IN (3, 9)
Run Code Online (Sandbox Code Playgroud)

,这将意味着"返回所有行b要么是27,AND c或者是39).

这将返回行1,3并且5,由于行5满足第二查询,但不是第一个条件.


Bri*_*say 5

第2行和第4行的返回是正确的,尽管您选择(4,4)会使其更加混乱,因为它是多余的.AND表示该行必须满足您的条件才能成为真.如果查询有WHERE b IN(5,7) AND c IN(4,9),则返回第2,3和4行.

如果你想成对,你需要拥有所有的组合.例如,b IN(5,7) AND c IN(4,9)将产生(5,4),(5,9),(7,4)和(7,9)作为可行的组合,而不仅仅是(5,4)和(7,9)


sou*_*rge 5

您可以按顺序评估每个条件,它可以让您更好地了解这里发生的事情.您的查询声明应该选择所有值,其中b是5或7且c是4,所以让我们使用first condition(b IN (5,7))减少表:

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     1    |     2    |     3    | < No match
 +----------+----------+----------+
 |     2    |     5    |     4    | < Match
 +----------+----------+----------+
 |     3    |     7    |     9    | < Match
 +----------+----------+----------+
 |     4    |     7    |     4    | < Match
 +----------+----------+----------+
Run Code Online (Sandbox Code Playgroud)

现在,让我们评估下一个条件,两者都必须为真,以便选择一行(c IN (4,4),它基本上是相同的c = 4):

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     2    |     5    |     4    | < Match
 +----------+----------+----------+
 |     3    |     7    |     9    | < No match
 +----------+----------+----------+
 |     4    |     7    |     4    | < Match
 +----------+----------+----------+
Run Code Online (Sandbox Code Playgroud)

其他一切都是有效的:

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     2    |     5    |     4    |
 +----------+----------+----------+
 |     4    |     7    |     4    |
 +----------+----------+----------+
Run Code Online (Sandbox Code Playgroud)