where子句产生奇怪的结果

时间:2013-07-30 10:29:01

标签: mysql

我希望获得某个条件的前1000个非空结果的列的最大值。然后,当下一个1000,等等。我这样做是为了不同的条件,但是当我使用dayofweek时,我发现了一些奇怪的东西。我向你展示的第一个命令是:

mysql> select max(id),max(d20) from (select id, d20 from data where d20 is not null and id<1000000 and dayofweek(day)=1 limit 1000) x;
+---------+----------+
| max(id) | max(d20) |
+---------+----------+
|  100281 |    13785 |
+---------+----------+
1 row in set (0.44 sec)

但实际上我想要第二个命令,它不能按预期工作。

mysql> select max(id),max(d20) from (select id, d20 from data where d20 is not null and id>100000 and dayofweek(day)=1 limit 1000) x;
+---------+----------+
| max(id) | max(d20) |
+---------+----------+
|  303765 |        0 |
+---------+----------+
1 row in set (0.02 sec)

有任何线索吗?

1 个答案:

答案 0 :(得分:1)

以限制为1的极端情况为准。

这意味着,子查询返回id <1000000的任何行(没有顺序使行确定),这使得MAX(id)和MAX(d20)仅返回该行的值。几乎没有代表整个集合。

将限制提高到1000只会使样本更大,但仍然会给出一个不确定的结果,具体取决于采样的1000行(假设有超过1000行匹配)。每次执行查询时,您可能会得到不同的结果,因此期望特定结果不起作用。

如果您需要确定性结果,请在限制结果之前将ORDER BY添加到子查询中。