在“WHERE”在MySQL条款倍数“IN”表达式的计算(Evaluation of multipl

2019-07-30 23:00发布

通过更新@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 )?

Answer 1:

SELECT * FROM TABLE_NAME WHERE b IN(5,7) AND c IN(4,4) 

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

你是什​​么“中对评价?”的意思

更新:

我将增加一个行的示例:

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

如果你想匹配整个集,您可以使用此语法:

SELECT  *
FROM    table_name
WHERE   (b, c) IN ((2, 3), (7, 9))

这意味着:“返回所有行,其中b2c3的同时,OR b7с9在同一时间”。

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

但是,如果你重写此查询的其他方式,例如:

SELECT  *
FROM    table_name
WHERE   b IN (2, 7)
        AND c IN (3, 9)

,这将意味着“返回所有行,其中b是要么27 ,AND c要么是39 )。

这将返回的行135中,由于行5满足条件用于第二查询,但不为第一个。



Answer 2:

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



Answer 3:

你可以为了评估每一个条件,它可能给你在这里发生了什么更好的主意。 查询指出,所有值应该被选择,其中b是5或7和c是4,因此让我们使用第一条件减小表( b IN (5,7)

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     1    |     2    |     3    | < No match
 +----------+----------+----------+
 |     2    |     5    |     4    | < Match
 +----------+----------+----------+
 |     3    |     7    |     9    | < Match
 +----------+----------+----------+
 |     4    |     7    |     4    | < Match
 +----------+----------+----------+

现在,让我们评估下一个条件,两者都必须在顺序是真实对于行被选中( c IN (4,4) ,HICH是基本上相同c = 4 ):

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     2    |     5    |     4    | < Match
 +----------+----------+----------+
 |     3    |     7    |     9    | < No match
 +----------+----------+----------+
 |     4    |     7    |     4    | < Match
 +----------+----------+----------+

一切是有效的:

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     2    |     5    |     4    |
 +----------+----------+----------+
 |     4    |     7    |     4    |
 +----------+----------+----------+


Answer 4:

是的,我相信你是正确的。

用于有效地, 'IN' 可以被认为速记(B = 5 OR B = 7)。 这是不是它是如何工作的“引擎盖下”,但它是想一个好办法。

对于大表,多个“IN”的条款会导致性能问题。

编辑:

上述海报是正确的,C IN(4,4)是没有意义的。 你可以很轻松地说“和C = 4”。

如果转换的条款,他们的逻辑等价物,你知道为什么:

SELECT * FROM表WHERE(B = 5 OR B = 7)和(c = 4或C = 4)



Answer 5:

您的例子不正是说明你的问题,但多个IN子句不是彼此相关; 它们在序列被评估像任何其他WHERE子句

因此,下面的查询

SELECT * FROM FOO WHERE b IN(5,7) AND c IN(4,8)

将匹配任何如下:

b  c
----
5  4
5  8
7  4
7  8

IN可以被认为简写或分离的比较。 这意味着之前的查询,也可以写为(力学略有不同,但概念是相同的):

SELECT * FROM FOO WHERE (b = 5 OR b = 7) AND (c = 4 OR c = 8)

所以,在你的榜样,是的,返回的行都是2和4,但它是不是很适合你假设的原因。



文章来源: Evaluation of multiples 'IN' Expressions in 'WHERE' clauses in mysql