700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > MySQL分组然后取每个分组中按照某些字段排序的topN条数据

MySQL分组然后取每个分组中按照某些字段排序的topN条数据

时间:2023-05-05 06:28:27

相关推荐

MySQL分组然后取每个分组中按照某些字段排序的topN条数据

数据库|mysql教程

MySQL,分组,然后,每个,按照,某些,字段,排序,top

数据库-mysql教程

方客源码论坛,vscode添加环境,ubuntu xlrd,tomcat配置out,sqlite3设置,jsp批量上传图片插件,前端框架有必要学吗,网易云可以爬虫数据吗,php xml格式化,肇庆seo优化服务,易语言网站速度,修改网页收费的代码,dede美食餐饮公司织梦模板lzw

MySQL分组然后取每个分组中按照某些字段排序的topN条数据 建表 CREATE TABLE `t` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, `c` int(11) DEFAULT NULL, `itime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) E

js树形菜单源码,ubuntu存储占满卡死,部署jar到Tomcat上,赣州爬虫ip,php招聘岗位要求,壁山靠谱的seo一站式服务商lzw

mysqlhelper使用源码,vscode单机在浏览器中打开,ubuntu绑定ip,浏览器怎么出现tomcat,sqlite和redis,全国网页设计公司,域名转发服务器,微课堂插件,前端最新的框架,中国队爬虫,eg php,兰州seo自动自动动自,table网站模版,网页两边悬浮窗源代码,whmcs模板,手机端选择城市页面,简单图书馆管理系统,微店小程序源码lzw

MySQL分组然后取每个分组中按照某些字段排序的topN条数据

建表

CREATE TABLE `t` ( `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, `c` int(11) DEFAULT NULL, `itime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入测试数据

INSERT INTO t(`a`, `b`, `c`, `itime`) VALUES (1, 1, 1, -12-04 19:07:01);INSERT INTO t(`a`, `b`, `c`, `itime`) VALUES (1, 1, 2, -12-04 19:07:02);INSERT INTO t (`a`, `b`, `c`, `itime`) VALUES (1, 1, 3, -12-04 19:07:03);INSERT INTO t (`a`, `b`, `c`, `itime`) VALUES (1, 1, 4, -12-04 19:07:04);INSERT INTO t(`a`, `b`, `c`, `itime`) VALUES (1, 2, 1, -12-04 19:07:01);INSERT INTO t (`a`, `b`, `c`, `itime`) VALUES (1, 2, 2, -12-04 19:07:02);INSERT INTO t(`a`, `b`, `c`, `itime`) VALUES (1, 2, 3, -12-04 19:07:03);INSERT INTO t (`a`, `b`, `c`, `itime`) VALUES (1, 2, 4, -12-04 19:07:04);INSERT INTO t(`a`, `b`, `c`, `itime`) VALUES (1, 2, 5, -12-04 19:07:05);INSERT INTO t (`a`, `b`, `c`, `itime`) VALUES (1, 2, 6, -12-04 19:07:06);

按照a,b分组,并且按照itime字段倒叙排列,取每组的top3

SELECTt.a, t.b,substring_index(group_concat(IFNULL(t.c,0)ORDER BYt.itime DESC),",",3) c,substring_index(group_concat(t.itimeORDER BYt.itime DESC),",",3) timeFROMt tGROUP BYt.a ,t.b;

结果集如下:

注意:

A、此方法需要上层应用再做一次处理:上层应用取出结果集以后,将数据按照逗号,再切分成topN份数据,(注意,有可能有些组没有topN份数据)

B、IFNULL判断很重要,否则MySQL会将下一条数据放进去。如果c列为NULL,则设置一个默认值为0,防止将第四条数据(1)放进去。

下图是没有IFNULL的错误答案:

PS:如果不是万不得已,无法实现此功能。不建议在MySQL中使用如此复杂的SQL语句。

如果你有更好的写法,请回复一下,让我知道,谢谢

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。