mysql разные запросы приводят к локальному хосту и онлайн-серверу

#mysql

#mysql

Вопрос:

У меня есть таблица с именем tblusermesin, и у меня есть такие данные

 Id  id_mesin  id_io       waktu           value
 1   m001     io001   2016-09-27 17:08:01   0
 2   m001     io002   2016-09-27 17:09:39   0
 3   m001     io002   2016-09-27 17:09:59   1
 4   m001     io001   2016-09-27 17:10:00   1
 5   m001     io001   2016-09-28 10:03:10   0
 6   m001     io001   2016-09-28 10:03:11   1
 7   m001     io001   2016-09-28 10:03:12   0
  

Я хочу получить последние данные для каждого io_id. Я использую запрос

 select  id_mesin,id_io,waktu,value FROM 
(select  id_mesin,id_io,waktu,value from tblusermesin  order by waktu desc)a
group by id_io;
  

В localhost результат правильный, но когда я использую этот запрос на онлайн-сервере, результат отличается.

что не так и почему это произошло? пожалуйста, помогите мне. Спасибо

Комментарии:

1. Лучше поместить ваш исходный запрос в виде текста в вопросе. Поскольку вы заказываете по desc , почему вы ожидаете минимального значения? Если вам нужно максимальное значение waktu для каждого io_id, почему бы вам просто не заставить подзапрос возвращать это вместо возврата полного списка в отсортированном порядке?

Ответ №1:

Что не так, так это запрос. С этим запросом любой результирующий набор считается правильным, ни один из результирующих наборов не является более правильным или неправильным, чем другой.

Значение, возвращаемое для waktu , не определено. Нет гарантии, что значение, возвращаемое для waktu , будет из какой-либо конкретной строки в группе, нет гарантии, что это будет самое высокое значение или самое низкое значение.

Другие реляционные базы данных выдали бы ошибку с вашим запросом, что-то вроде «неагрегатное выражение в списке ВЫБОРА, а не в ГРУППЕ ПО». (Мы можем заставить MySQL демонстрировать аналогичное (и более стандартное) поведение, включив ONLY_FULL_GROUP_BY в sql_mode.)

MySQL позволяет обрабатывать запрос из-за нестандартного расширения, специфичного для MySQL, для GROUP BY. При включенном расширении (которое по умолчанию) MySQL может возвращать значение waktu из любой строки в группе.

Если вы хотите вернуть наибольшее значение waktu для группы, используйте агрегатную функцию MAX() .

   SELECT t.foo
       , MAX(t.waktu)
    FROM sharkbait t
    GROUP BY t.foo 
  

Комментарии:

1. Это отвечает на вопрос, который вы задали… «что не так, и сделай так, чтобы это произошло». Вы можете использовать этот запрос как встроенное представление и присоединиться к исходной таблице ON tt.io_id = o.io_id AND tt.waktu = o.waktu . Если для одного и того же есть несколько строк с одинаковым io_id «последним» значением waktu , запрос вернет для этого несколько строк io_id . Вы можете использовать GROUP BY во внешнем запросе, чтобы свернуть строки. В качестве другой альтернативы вы можете использовать коррелированные подзапросы в списке ВЫБОРА ORDER BY waktu DESC LIMIT 1 , хотя этот подход обычно медленнее с большими наборами результатов.