возвращать странные значения при попытке найти максимальную строку таблицы на основе даты

0

Я пытаюсь сделать то, что, по моему мнению, было относительно простым. Получите последнее введенное значение пользователя. У меня есть таблица, которая отслеживает все их записи, называемые plan_activities_logs. Я использовал это выражение, чтобы получить всю активность в отношении одного пользователя:

SELECT created_at as last_active, plan_id, plan_value 
from plan_activity_logs where plan_id IN (select id from plans where tile_id = 30);

и он возвращает мне таблицу, которая выглядит так: Изображение 174551

но когда я пытаюсь сделать что-то вроде этого:

SELECT MAX(created_at) as last_active, plan_id, plan_value from plan_activity_logs where plan_id IN (select id from plans where tile_id = 30);

Я получаю это: Изображение 174551

в то время как дата и идентификатор верны, значение плана является неправильным значением. Любая идея, что я делаю неправильно?

Теги:
database

3 ответа

1
Лучший ответ

Это должно работать

SELECT created_at as last_active, plan_id, plan_value from plan_activity_logs where plan_id IN (select id from plans where tile_id = 30) order by created_at desc limit 1;
  • 0
    спасибо, да, это сработало. Есть ли причина, по которой мой запрос не работал? Судя по данным, я смог догадаться, что он выбирает максимальную дату, но не значение, связанное с этой датой. Как бы я пошел об этом? Используя группу?
2

Любая идея, что я делаю неправильно?

вы не делаете ничего плохого. Согласно руководству

Если ONLY_FULL_GROUP_BY отключен, расширение MySQL для стандартного использования SQL GROUP BY позволяет выбрать список выбора, условие HAVING или ORDER BY для ссылки на неагрегированные столбцы, даже если столбцы функционально не зависят от столбцов GROUP BY. Это заставляет MySQL принимать предыдущий запрос. В этом случае сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения являются недетерминированными, что, вероятно, не является тем, что вы хотите.

Другими словами, это поведение соответствует спецификации. Запрос возвращает случайное недетерминированное значение, поскольку вы используете нестандартное расширение MySql для группы по запросу.

  • 0
    TL; DR - правильно использовать GROUP BY.
0

Попробуйте этот запрос:

select @rn := 1;
select created_at as last_active, 
       plan_id, 
       plan_value
from (
    select created_at as last_active, 
           plan_id, 
           plan_value,
           @rn := @rn + 1 rn
    from plan_activity_logs
    where plan_id IN (select id from plans where tile_id = 30)
    order by created_at desc
) a where rn = 1;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню