从MySQL表中获取每个用户的最后一行(活动)

时间:2015-06-09 22:29:02

标签: 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

现在,我希望获得包含所有用户的列表以及最终活动的日期。 所以在我的例子中我想得到:

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

我的想法是先orderBy 'created_at' DESC然后再做DISTINCT('user_id')。但这似乎不起作用。我也尝试过子查询(首先是orderBy然后是不同的),但也没有结果。

关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:2)

如果你只关心user_id和created_date,你可以按user_id进行分组并使用max()聚合函数:

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;

或者,如果您想要最后一行的所有详细信息,您可以检索派生表中的最大值并在连接中使用它:

| 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 |

Sample SQL Fiddle

第一个第二个查询只会获取user_id和date,而第二个查询会为您提供所有内容:

{{1}}

答案 1 :(得分:1)

尝试使用此查询:

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