#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 Не могу гарантировать, что это работает, как задумывалось (на тестовой выборке дало ок-результат), нужно стороннее подтверждение/опровержение
Комментариев нет:
Отправить комментарий