#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
, хотя этот подход обычно медленнее с большими наборами результатов.