Страницы

Поиск по вопросам

воскресенье, 8 марта 2020 г.

MySQL: Как получить последние записи одним запросом?

#mysql #запрос


В таблице в хронологическом порядке фиксируются состояния пользователей (и их изменения),
например,

datetime   | uid | status 
2016-07-01 | 14  | Register
2016-07-01 | 14  | Active
2016-07-02 | 15  | Active
2016-07-02 | 16  | Register
2016-07-02 | 14  | Pending
2016-07-04 | 16  | Pending


Как правильно сформулировать MySQL-запрос, чтобы в итоге получить

datetime   | uid | status  
2016-07-02 | 15  | Active
2016-07-02 | 14  | Pending
2016-07-02 | 16  | Pending


То есть как можно в MySQL-запросе указать, чтобы выводились только самые последние
состояния для уникальных uid?
Пытался GROUP BY, DISTINCT и MAX(), но время выводит точно максимальное, а значение
status – не максимальное.

P.S. Саму таблицу дал схематически, время фиксируется до секунды, пересечений по
времени нет. Нужна просто последняя запись по каждому из uid. Буду благодарен за хотя
бы подсказку, в каком направлении смотреть.
    


Ответы

Ответ 1



select uid, datetime, status from tablename join ( select uid, max(`datetime`) as datetime from tablename group by uid ) lastvalues using(uid, datetime) При условии уникальности (а лучше - уникального индекса) пары uid & datetime будет возвращать корректный результат.

Ответ 2



SELECT uid, max(`datetime`) as datetime, substr(max(concat(`datetime`,status)),20) as status FROM tablename GROUP BY uid Смещение 20 в substr указано исходя из предположения, что поле datetime имеет тип данных datetime. Для других типов данных надо указать подходящее смещение исходя из длины поля даты в символьном представлении. Так же убедитесь, что при ваших региональных настройках при автоматическом преобразовании даты к строке компоненты идут в порядке год-месяц-день, для правильной сортировки.

Ответ 3



Кажется, так: SELECT max(`datetime`) as datetime, uid, status FROM tablename GROUP BY uid Не могу гарантировать, что это работает, как задумывалось (на тестовой выборке дало ок-результат), нужно стороннее подтверждение/опровержение

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

Отправить комментарий