我有一个简单的查询,在where子句中有几行和多个条件,但它只返回一行而不是13.没有连接,语法被三重检查,似乎没有错误。
查询:
new Thread(new Runnable() {
@Override
public void run() {
viewStub.inflate();
initFragment();
}
}).start()
结果: 返回与where子句
中的随机数相关联的一行数据花费了大部分时间试图弄清楚这一点,现在已经没有想法了。请帮忙......
答案 0 :(得分:1)
如果没有更详细的测试用例,以及实际运行的实际SQL语句,则无法回答此问题。以下是一些"想法" ...
我们的第一个猜测是,您认为满足谓词的行实际上并不满足所有条件。
我们的第二个猜测是,您在SELECT列表中得到了一个汇总表达式(COUNT()
,MAX()
,SUM()
),导致隐式{{ 1}}。这是一个常见的"陷阱" ... GROUP BY
的非标准MySQL扩展,它允许非聚合出现在SELECT列表中,它们也不包含在GROUP BY中的表达式中条款。当完全省略GROUP BY
子句并且GROUP BY
列表中包含聚合时,会出现同样的问题。
但问题并没有在SELECT列表中提及聚合表达式。
我们的第三个猜测是初学者经常忽略的另一个问题:操作的优先顺序,尤其是SELECT
和AND
。例如,考虑表达式:
OR
当我们唱歌时,芝麻街的风格,......:"其中一件事与其他事情不一样,其中一件事并不属于......&#34 ;
第四个猜测......如果在 a AND b OR c
a AND ( b OR c )
( a AND b ) OR c
列表中返回的行的值为onecolumn
作为随机号码,则不是。 ..如果它是IN
列表中的第一个号码,我们非常怀疑IN列表实际上包含单个字符串值看起来像列出一个值,但实际上并非如此。
SELECT列表中的两个表达式看起来非常相似,但它们非常不同:
IN
第一个表达式是将 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
。
当新手动态创建SQL文本时,这种情况经常出现,认为他们可以传入字符串值,并且MySQL会在字符串中看到逗号作为SQL语句的一部分。
(但这并不能解释列表中某些随机的内容。)
这些都是猜测。这些是我们看到的最频繁的旅行,但我们只是在猜测。它可能完全是另一回事。在目前的形式中,没有确定的答案"问题。