求一条sql,group by 某一列A之后,按一个B列(记录时间)的顺序,显示最新的C列的值

zilaishuichina 2017-11-08 02:28:09
如下表:


DROP TABLE IF EXISTS `log_test`;
CREATE TABLE `log_test` (
`id` int(11) NOT NULL,
`account` int(11) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`count` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `log_test` VALUES ('1', '1001', 'aaa', '2017-11-08 14:01:30', '1');
INSERT INTO `log_test` VALUES ('2', '1001', 'aaa', '2017-11-08 14:01:34', '2');
INSERT INTO `log_test` VALUES ('3', '1001', 'bbb', '2017-11-08 14:01:41', '3');
INSERT INTO `log_test` VALUES ('4', '1002', 'ccc', '2017-11-08 14:08:49', '4');
INSERT INTO `log_test` VALUES ('5', '1002', 'ddd', '2017-11-08 14:09:23', '5');


一张日志性质的表,记录了某一个账号(account),在某个时间点(time),进行了某一行为的次数(count)

这张日志表里记录一个冗余字段:账号昵称(name),即日志当时这个账号的名字

但是由于系统是允许账号修改自己的昵称的,因此在这张日志表里,同一个account,可能有多个不同的name

现在我要统计 每个账号的某一行为的次数的求和:


select account, name, sum(count) from log_test group by account;

现在的查询结果:
account name sum(count)
1001 aaa 6
1002 ccc 9

我希望,name那一列,能显示为该账号的所有记录中,按time时间戳排序,距离当前时间最近的那一次的名字
即我希望结果为:
account name sum(count)
1001 bbb 6
1002 ddd 9

求sql该怎么写
...全文
514 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
select account, max(name), sum(count)  from  log_test  group by account;
zilaishuichina 2017-11-10
  • 打赏
  • 举报
回复
引用 7 楼 qq_38267263 的回复:
select account, max(name), sum(count)  from  log_test  group by account;
拒绝抖机灵
Flask2015 2017-11-09
  • 打赏
  • 举报
回复
我之前也遇到了类似的问题,也差不多类似的解法,也没找到格式的聚合函数实现这个功能
zilaishuichina 2017-11-08
  • 打赏
  • 举报
回复
引用 2 楼 qq_37170555 的回复:
[quote=引用 1 楼 zilaishuichina 的回复:] 暂时已解决,

select account, name, sum(count) from (select * from log_test order by time desc) as tmp group by account;
不知道还有什么更好的办法么
可以就行了嘛,搞得这么复杂干嘛呢,你那样写其实挺简单的了啊[/quote] 因为 这个统计功能 是一个比较频繁使用的功能, 如果每次都是先生成一个临时的结果集, 再对临时的结果集group by, 不知道对效率有没有什么影响, 不是很懂, 这个sql 也是我连猜带试, 试出来的。。。。
zilaishuichina 2017-11-08
  • 打赏
  • 举报
回复
引用 3 楼 rucypli 的回复:
select account, name, sum(count) from (select * from log_test order by time desc) as tmp group by account; 这个 order by time desc没意义吧?
order by time desc 是为了让临时表里的数据是按 时间从近到远排过序了 这个时候再对临时表group by,mysql处理name列数据的时候,应该就是取的是临时表中,最先出现的那条记录的name,也就是时间最近的那条记录的name
rucypli 2017-11-08
  • 打赏
  • 举报
回复
select account, name, sum(count) from (select * from log_test order by time desc) as tmp group by account; 这个 order by time desc没意义吧?
听雨停了 2017-11-08
  • 打赏
  • 举报
回复
引用 1 楼 zilaishuichina 的回复:
暂时已解决,

select account, name, sum(count) from (select * from log_test order by time desc) as tmp group by account;
不知道还有什么更好的办法么
可以就行了嘛,搞得这么复杂干嘛呢,你那样写其实挺简单的了啊
zilaishuichina 2017-11-08
  • 打赏
  • 举报
回复
暂时已解决,

select account, name, sum(count) from (select * from log_test order by time desc) as tmp group by account;
不知道还有什么更好的办法么

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧