mySql分组排序
mysql 排序学习---mysql
1、建表语句
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '姓名',
`score` int(11) NOT NULL COMMENT '成绩,
`classid` int(11) NOT NULL COMMENT '班级',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='学生';
2、插入数据
insert into student(Name, Score, ClassId) values("lqh", 60, 1);
insert into student(Name, Score, ClassId) values("cs", 99, 1);
insert into student(Name, Score, ClassId) values("wzy", 62, 1);
insert into student(Name, Score, ClassId) values("zqc", 88, 2);
insert into student(Name, Score, ClassId) values("bll", 100, 2);
3、开始玩转MySQL
查询每个班级最大分数
select max(t.score) score,t.classid from student t group by t.classid
显然这个在实际应用中不合场景,上面只能查出每个班级的最高分,但是是谁查不到
用下面这个语句,用分组的最高分、班级去原表中去匹配,命中出结果,就是相应的学生信息:
select s.* from student s join
(select max(t.score) score,t.classid from student t group by t.classid )r
on s.classid=r.classid and s.score=r.score
最高的第一名查出来了,但是比如我们要找前3名,前5名是谁,怎么搞?group by的max函数只能取最大值,前几个怎么玩???
limit 3,limit 5,group 里面没有这么玩的,limit只是对查出的结果做最外层的封装
SELECT
s1.*
FROM
student s1
WHERE
(
SELECT
count(DISTINCT(s2.score))
FROM
student s2
WHERE
s1.classid = s2.classid
AND s2.score > s1.score
) < 2;
先给结果,但是这个我理解不了,为什么where条件为什么这样写?
select a.classid,a.`name`,a.score ,a.id ,b.id ,count(b.id)from student a left join student b
on a.classid=b.classid and a.score<b.score
GROUP BY a.classid,a.`name`,a.score having count(b.id)<2 order by a.classid,a.score
上面这个SQL就好理解多了
select a.classid,a.`name`,a.score ,a.id ,b.id ,count(b.id)from student a left join student b
on a.classid=b.classid and a.score<b.score
GROUP BY a.classid,a.`name`,a.score
先看这个,一下子就明白了,把a表中的每个成绩都排个序,count(b.id)就是成绩的排名,0就是第一,没有比这个分数更高的,1就表示第二,只有一个比这个分数高的,依次类推
having count下 ,你要取前2名的话 having count就小于2,感觉这个好理解多了
https://blog.csdn.net/github_26672553/article/details/50800835
mySql分组排序的更多相关文章
- MySQL分组排序(取第一或最后)
MySQL分组排序(取第一或最后) 方法一:速度非常慢,跑了30分钟 SELECT custid, apply_date, rejectrule FROM ( SELECT *, IF ( , ) A ...
- mysql 分组排序前n + 长表转宽表
MySQL数据库优化的八种方式(经典必看) 建表 CREATE TABLE if not EXISTS `bb` ( `id` int not null primary key auto_increm ...
- mysql分组排序加序号(不用存储过程,就简简单单sql语句哦)
做前端好长时间了,好久没动sql了.在追一个喜欢的女孩,做测试的,有这么个需求求助与本屌丝,机会难得,开始折腾起来,配置mysql,建库,建表.... 一 建表 CREATE TABLE `my_te ...
- mysql 分组排序取最值
查各个用户下单最早的一条记录 查各个用户下单最早的前两条记录 查各个用户第二次下单的记录 一.建表填数据: SET NAMES utf8mb4; -- 取消外键约束 ; -- ------------ ...
- mysql分组排序取最大值所在行,类似hive中row_number() over partition by
如下图, 计划实现 :按照 parent_code 分组, 取组中code最大值所在的整条记录,如红色部分.(类似hive中: row_number() over(partition by)) sel ...
- MYSQL 分组排序
http://www.cnblogs.com/merru/articles/4626045.html SELECT a.shop_id, a.price, count(*) as rankFROM m ...
- mysql分组排序加序号
参照https://www.cnblogs.com/CharlieLau/p/6737243.html 一.需求 新加一个Sort 字段,初始值为1,按照parentID分组添加sort值. 根据原数 ...
- MySql 分组排序取时间最大的一条记录
SELECT A.* FROM digital_asset A, (SELECT name, max(last_updated) max_day FROM digital_asset GROUP BY ...
- mysql 分组内 排序
mysql 分组内 排序 类似于 sqlserver over partition by 因为mysql中木有sqlserver over partition by这个函数,要从sqlserver ...
随机推荐
- docker: docker安装和镜像下载
1 安装docker的apt源 apt-get install apt-transport-https ca-certificates curl software-properties-common ...
- 代码空间项目 -- 获取当前时间之前的某一天-Calender类的使用
Calendar类的静态方法getInstance()可以初始化一个日历对象:Calendar now = Calendar.getInstance(); 1.Calendar的基本用法calenda ...
- 02-线性结构3 Reversing Linked List(25 point(s)) 【链表】
02-线性结构3 Reversing Linked List(25 point(s)) Given a constant K and a singly linked list L, you are s ...
- Vue.js的动态组件模板
组件并不总是具有相同的结构.有时需要管理许多不同的状态.异步执行此操作会很有帮助. 实例: 组件模板某些网页中用于多个位置,例如通知,注释和附件.让我们来一起看一下评论,看一下我表达的意思是什么.评论 ...
- WSDL文档深入分析
借助jdk的wsimort.exe工具生成客户端代码 格式:wsimport -keep url //url为wsdl文件的路径 直接生成客户端代码会抛异常, 无法生成客户端代码, 解决办法: 将 ...
- Myeclipse+TestNG白盒测试环境搭建
myeclipse基础环境搭建这里不讲了,我用的是myeclipse2013,网上有破解方法http://jingyan.baidu.com/article/aa6a2c14d0c9700d4c19c ...
- #pragma once与#ifndef
都是为了避免同一个头文件被包含多次.在编译器对这两种方式都支持的情况下,区别很小. 方式一: #pragma once ...//这里放声明语句 方式二: #ifndef 宏名 #def 宏名 ... ...
- 用margin还是用padding?(3)—— 负margin实战
看过一篇文章是关于我知道你不知道的负Margin,里面对margin做了总结: 当margin四个值都为正数值的话,那么margin按照正常逻辑同周围元素产生边距.当元素margin的top和left ...
- CentOS6.5 yum源设置
在安装完CentOS后一般需要修改yum源,才能够在安装更新rpm包时获得比较理想的速度. 国内比较快的有163源.sohu源.这里以163源为例子. 1. cd /etc/yum.repos.d 2 ...
- boost replace_if replace_all_regex_copy用法
#include <boost/algorithm/string.hpp> // for is_any_of #include <boost/range/algorithm/repl ...