>我在 where 子句中有几行和多个条件的简单查询,但它只返回一行而不是 13 行。没有连接,语法经过三重检查,似乎没有错误。
查询:
select column1, column2, column3
from mydb
where onecolumn in (number1, number2....number13)
结果:返回与 WHERE 子句中的随机数关联的一行数据
花了一天中的大部分时间试图弄清楚这个问题,现在没有想法了。请帮忙...
如果没有更详细的测试用例,以及实际正在运行的实际 SQL 语句,这个问题就无法回答。这里有一些"想法"...
我们的第一个猜测是,您认为将满足谓词的行实际上并不满足所有条件。
我们的第二个猜测是,您在 SELECT 列表中有一个聚合表达式(COUNT()
、MAX()
、SUM()
),它导致了隐式GROUP BY
。这是一个常见的"陷阱"...GROUP BY
的非标准 MySQL 扩展,它允许非聚合出现在 SELECT 列表中,这些扩展也不作为表达式包含在 GROUP BY 子句中。 当完全省略GROUP BY
子句并且聚合包含在SELECT
列表中时,会出现同样的陷阱。
但是这个问题没有提到 SELECT 列表中的聚合表达式。
我们的第三个猜测是初学者经常忽略的另一个问题:操作的优先级顺序,尤其是AND
和OR
。例如,考虑以下表达式:
a AND b OR c
a AND ( b OR c )
( a AND b ) OR c
当我们一起唱歌时,想想那些,芝麻街风格,...:"这些东西中的一个与其他东西不同,这些东西中的一个不属于......"
第四个猜测...如果不是因为返回的行的值为 onecolumn
作为IN
列表中的随机数......如果它是IN
列表中的第一个数字,我们会非常怀疑 IN 列表实际上包含一个看起来像列表 A 值的字符串值,但实际上不是。
SELECT 列表中的两个表达式看起来非常相似,但它们非常不同:
SELECT t.n IN (2,3,5,7) AS n_in_list
, t.n IN ('2,3,5,7') AS n_in_string
FROM ( SELECT 2 AS n
UNION ALL SELECT 3
UNION ALL SELECT 5
) t
第一个表达式是将n
与四个值列表中的每个值进行比较。第二个表达式等效于 t.n IN (2)
。
当新手动态创建SQL文本时,这是一个频繁的旅行,认为他们可以传入字符串值,并且MySQL会将字符串中的逗号视为SQL语句的一部分。
(但这并不能解释列表中一些随机的
。这些都只是猜测。这些是我们看到的最常见的绊倒,但我们只是猜测。它可能完全是另一回事。以目前的形式,这个问题没有明确的"答案"。