В таблице в хронологическом порядке фиксируются состояния пользователей (и их изменения), например,
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. Буду благодарен за хотя бы подсказку, в каком направлении смотреть.
select uid, datetime, status
from tablename
join (
select uid, max(`datetime`) as datetime
from tablename
group by uid
) lastvalues using(uid, datetime)
При условии уникальности (а лучше - уникального индекса) пары uid & datetime будет возвращать корректный результат.
SELECT uid, max(`datetime`) as datetime,
substr(max(concat(`datetime`,status)),20) as status
FROM tablename
GROUP BY uid
Смещение 20 в substr указано исходя из предположения, что поле datetime имеет тип данных datetime. Для других типов данных надо указать подходящее смещение исходя из длины поля даты в символьном представлении. Так же убедитесь, что при ваших региональных настройках при автоматическом преобразовании даты к строке компоненты идут в порядке год-месяц-день, для правильной сортировки.
Кажется, так:
SELECT max(`datetime`) as datetime, uid, status
FROM tablename
GROUP BY uid
Не могу гарантировать, что это работает, как задумывалось (на тестовой выборке дало ок-результат), нужно стороннее подтверждение/опровержение
Виртуальный выделенный сервер (VDS) становится отличным выбором
У меня несколько одинаковых по настройкам VDS Ubuntu 1604