mysql的语句同时出现group by,order by,limit时,所请求的数据往往不是自己所需要的
以下面的课程表为例,需要获取不同标签下的一门课程,并根据浏览量降序排列,取前四条。
其中label:分组,click:排序
CREATE TABLE `course` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL COMMENT '课程名称',
`label` varchar(255) DEFAULT NULL COMMENT '课程标签',
`click` int(11) DEFAULT NULL COMMENT '浏览量',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='课程/文章表';
添加数据如下:
image.png
通常写法:
image.png
错误:
排名第一的点击100次的:2019语文-作文 没有了,跟想要的数据不一样
错误分析:
1.sql的语句执行顺序是一个从前往后的过程,可以理解成后面的语句作用于前面语句生成的临时数据表
2.group by与order by的作用字段不同时,排序是在分组后的数据的基础上进行的,此时的数据或许已不是你想要的数据了
3.mysql没法先排序后分组,语法不允许
先说结论:
暂未找到能一条语句解决该问题的sql写法 (希望能做到的朋友可以留言一起学习下)
急于完成工作任务的,跳过该问题,采用下面解决方案
解决方式:
1.根据where条件,order by 排序,数据库查询limit条(可多于limit条)数据
2.让程序来做分组筛选
3.程序做分组的同时,判断是否达到limit的数量需求
4.达到limit条数的,结束程序分组筛选
4.小于limit条数的,修改where条件,再次从步骤1开始