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