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

151
17 мая 2019, 05:50

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

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. Буду благодарен за хотя бы подсказку, в каком направлении смотреть.

Answer 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 будет возвращать корректный результат.

Answer 2
SELECT uid, max(`datetime`) as datetime,
       substr(max(concat(`datetime`,status)),20) as status
  FROM tablename
 GROUP BY uid

Смещение 20 в substr указано исходя из предположения, что поле datetime имеет тип данных datetime. Для других типов данных надо указать подходящее смещение исходя из длины поля даты в символьном представлении. Так же убедитесь, что при ваших региональных настройках при автоматическом преобразовании даты к строке компоненты идут в порядке год-месяц-день, для правильной сортировки.

Answer 3

Кажется, так:

SELECT max(`datetime`) as datetime, uid, status 
FROM tablename
GROUP BY uid

Не могу гарантировать, что это работает, как задумывалось (на тестовой выборке дало ок-результат), нужно стороннее подтверждение/опровержение

READ ALSO
Вход в MySQL в консоли Ububtu под root

Вход в MySQL в консоли Ububtu под root

У меня несколько одинаковых по настройкам VDS Ubuntu 1604

133
Текст без вертикальных отступов

Текст без вертикальных отступов

Ссылка на codepen - https://codepenio/anon/pen/bQmYgm

272
Верстка макета по 12-колонкам

Верстка макета по 12-колонкам

Я бы хотел спросить1

239