2015-06-09 3 views
0

У меня есть таблица с журналом всех действий, которые выполняют мои пользователи (логины, сообщения, поиск, ...).Получить последнюю строку (активность) для каждого пользователя из таблицы MySQL

id user_id created_at activity 

1 2   2015-02-14 x 
2 3   2015-02-15 x 
3 1   2015-02-14 x 
4 2   2015-02-16 x 
5 2   2015-02-17 x 
6 3   2015-02-17 x 
7 1   2015-02-17 x 
8 1   2015-02-18 x 
9 2   2015-02-19 x 

Теперь я хочу получить список со всеми пользователями и дату их действия LAST. Так в моем примере я хочу получить:

User 1: 2015-02-18 
User 2: 2015-02-17 
User 3: 2015-02-17 

Моя идея была первой orderBy 'created_at' DESC, а затем сделать DISTINCT('user_id'). Но это не работает. Я также пробовал подзапросы (первый порядокBy, а затем отличный), но также и никакого результата.

Любые идеи о том, как это решить?

ответ

1

Попробуйте с этим запросом:

select user_id, max(created_at) as last_activity 
from your_table 
group by user_id 
2

Если вы просто заботитесь о user_id и CREATED_DATE можно сгруппировать по user_id и использовать макс() агрегатной функции:

select user_id, max(created_at) as last_created_at from your_table group by user_id; 

Или, если вы хотите все детали последних строк вы можете получить максимальные значения в производной таблице и использовать их в соединении:

select * from your_table t1 
join (select user_id, max(created_at) as max_date 
     from table1 group by user_id 
    ) t2 on t1.user_id = t2.user_id and t1.created_at = t2.max_date; 

Sample SQL Fiddle

Первый второй запрос будет просто получить вам user_id и дату, тогда как второй запрос даст вам все:

| id | user_id | created_at | activity | user_id | max_date | 
|----|---------|------------|----------|---------|------------| 
| 6 |  3 | 2015-02-17 |  x |  3 | 2015-02-17 | 
| 8 |  1 | 2015-02-18 |  x |  1 | 2015-02-18 | 
| 9 |  2 | 2015-02-19 |  x |  2 | 2015-02-19 | 
Смежные вопросы