通过更新@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 |
+----------+----------+----------+
它是正确的假设,返回的行都是1
和3
(而不是5
)?
Answer 1:
SELECT * FROM TABLE_NAME WHERE b IN(5,7) AND c IN(4,4)
这个查询将返回行,其中b
是要么5
或7
,AND c
是4
。
你是什么“中对评价?”的意思
更新:
我将增加一个行的示例:
+----------+----------+----------+
| 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))
这意味着:“返回所有行,其中b
是2
和c
是3
的同时,OR b
是7
和с
是9
在同一时间”。
在上面的示例中,该查询将返回的行1
和3
但是,如果你重写此查询的其他方式,例如:
SELECT *
FROM table_name
WHERE b IN (2, 7)
AND c IN (3, 9)
,这将意味着“返回所有行,其中b
是要么2
或7
,AND c
要么是3
或9
)。
这将返回的行1
, 3
和5
中,由于行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