group by 多个字段后取最近一条记录

表结构:create table test_tmp(
id int,
log_time datetime,
item varchar(10)
)
create table test_d(
id int,
name varchar(10)
)

测试数据:
insert into test_d values(1, 'hh');
insert into test_d values(2, 'xx');
insert into test_tmp values (1, '2018-08-16 16:13:36', 'a');
insert into test_tmp values (1, '2018-08-16 16:13:36', 'b');
insert into test_tmp values (1, '2017-08-16 16:13:36', 'a');
insert into test_tmp values (1, '2017-08-16 16:13:36', 'b');
insert into test_tmp values (1, '2018-08-16 16:13:36', 'a');
insert into test_tmp values (2, '2018-08-16 16:13:36', 'a');
insert into test_tmp values (2, '2018-08-16 16:13:36', 'b');
insert into test_tmp values (2, '2017-08-16 16:13:36', 'a');
insert into test_tmp values (2, '2017-08-16 16:13:36', 'b');
insert into test_tmp values (2, '2017-08-16 16:13:36', 'c');

我现在这样写只能取到所有的,如何取出每个id最近一条记录(时间)的item(用逗号分隔)?
select * from test_d d left join ( select id, log_time, group_concat(item) from test_tmp group by id, log_time) t on d.id = t.id

clipboard.png

阅读 7.1k
1 个回答

咱一步步来,首先,每个test_tmp.id最近的时间嘛,应该这样取的:

SELECT id, max(log_time) AS log_time
FROM test_tmp 
GROUP BY id;

其次,根据这个最近的时间,我们再在外面包一层即可:

SELECT
    t1.id, t1.log_time, group_concat(t1.item)
FROM test_tmp t1
INNER JOIN (
    SELECT id, max(log_time) AS log_time
    FROM test_tmp 
    GROUP BY id
) t2 ON t1.id = t2.id AND t1.log_time = t2.log_time
GROUP BY t1.id, t1.log_time;

这样我们就根据最近的时间,找出了哪些记录对应了这个最近的时间,在此基础上group_concat就能找出最近时间的item了。
并且,可以看出上面的sql语句没有与test_d表关联,如果需要test_tmp当中的id必须是test_d表中的id,再join一遍即可,你可以试一下。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题