mysql分组与排序一起_mysql-分组,排序,limit同时出现的问题

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='课程/文章表';

添加数据如下:

a5ec6b57a1f0

image.png

通常写法:

a5ec6b57a1f0

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值