8

应要求更新@Cesar。希望我明白你想要什么,如果没有,请回复。夸斯诺伊。

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

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

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

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

假设返回的唯一行是1and 3(而不是5)是否正确?

4

5 回答 5

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

此查询将返回行,其中b5or 7, ANDc4

“成对评估”是什么意思?

更新:

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

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

这意味着:“返回同时存在和存在的所有行,或者同时存在b2存在c的所有行。”3b7с9

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

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

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

,这将意味着“返回所有行,其中b2or 7, ANDc3or 9)。

这将返回 rows和1,因为 row满足第二个查询的条件,但不满足第一个查询的条件。355

于 2009-07-28T14:05:31.150 回答
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)

于 2009-07-28T14:03:53.523 回答
5

您可以按顺序评估每个条件,它可能会让您更好地了解这里发生的事情。您的查询表明应选择 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),本质上与 相同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    |
 +----------+----------+----------+
于 2009-07-28T14:05:37.283 回答
1

是的,我相信你是对的。

实际上,'IN' 可以被认为是 (b = 5 OR b = 7) 的简写。这不是它“在引擎盖下”的工作方式,但这是一种简单的思考方式。

对于大型表,多个“IN”子句会导致性能问题。

编辑:

上面的海报是正确的,c IN (4, 4) 是没有意义的。你可以很容易地说'AND c = 4'。

如果您将这些子句转换为它们的逻辑等价物,您就会明白原因:

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

于 2009-07-28T14:04:28.127 回答
1

您的示例并不能完全说明您的问题,但是多个 IN 子句彼此不相关;它们像任何其他 WHERE 子句一样按顺序进行评估

因此,以下查询

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

将匹配以下任何一项:

公元前
----
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。但这并不完全是您假设的原因。

于 2009-07-28T14:10:29.850 回答