具有一列和多个条件的 where 子句返回一行而不是 13



>我在 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 列表中的聚合表达式。


我们的第三个猜测是初学者经常忽略的另一个问题:操作的优先级顺序,尤其是ANDOR 。例如,考虑以下表达式:

  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语句的一部分。

(但这并不能解释列表中一些随机


这些都只是猜测。这些是我们看到的最常见的绊倒,但我们只是猜测。它可能完全是另一回事。以目前的形式,这个问题没有明确的"答案"。

最新更新