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

添加数据如下:

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这一篇最主要是记录下命令,方便以后查找 使用Mysql 创建数据库 create database mysql_t...
    Treehl阅读 609评论 0 0
  • MySQL数据库 课程目标:1.如何使用MySQL数据库,主要是讲解基本的语法2.如何设计数据库? 第一章 数据库...
    我爱开发阅读 1,341评论 1 4
  • 查询语句中select from where group by having order by limit的执行顺...
    许小小晴阅读 3,238评论 1 3
  • 本文主要总结了工作中一些常用的操作及不合理的操作,在对慢查询进行优化时收集的一些有用的资料和信息,本文适合有MyS...
    Chting阅读 644评论 0 1
  • 苏皓手沾冷水拍了拍脸,镜子里的自己虽然显得精神了些,但还是很苍白。 回到诊室,那些同届医生怜悯的目光毫不掩饰地聚集...
    红烧东坡肉阅读 379评论 14 3