2013-07-30 4 views
0

Я хочу получить максимальное значение столбца для первых 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) 

Любой ключ?

+2

Без соответствующего предложения 'ORDER BY',« first »и« next »означают бессмысленные слова. Таблицы не имеют встроенного порядка. –

+1

Что ж, строки с идентификатором> 100000 действительно имеют значение d20 больше 0? Кроме того, ... Damien был быстрее ... – fancyPants

+0

Вы просто получаете max (id) и max (d20) из индетерминированного образца из 1000 строк, соответствующих критериям. Из этих 1000 никто не имеет d20> 0 –

ответ

1

Возьмем крайний случай предел составляет 1.

Это означает, что подзапрос возвращает любую строку (нет никакого порядка по сделать ряд детерминированным), который имеет идентификатор < 1000000., что делает MAX (ID) и MAX (d20) возвращает значения только из этой строки. Вряд ли представитель всей коллекции.

Повышение предела до 1000 просто сделает образец более крупным, но все равно даст неопределенный результат в зависимости от того, какие 1000 строк выбраны (при условии, что существует более 1000 строк, которые соответствуют). Вы можете очень хорошо получить другой результат каждый раз, когда выполняете запрос, поэтому ожидание определенного результата не будет работать.

Если вам нужен детерминированный результат, добавьте ORDER BY к вашему подзапросу, прежде чем ограничивать результаты.

Смежные вопросы