分组后取前N条

这种题目面试中经常出现,记录一下

首先建表

CREATE TABLE `students` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',
  `clss_id` varchar(2) DEFAULT NULL COMMENT '班级id',
  `stu_name` varchar(16) DEFAULT NULL COMMENT '学生姓名',
  `age` int(11) DEFAULT NULL COMMENT '学生年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8

插入数据

insert  into `students`(`id`,`clss_id`,`stu_name`,`age`) values 

(1,'A','李明',90),

(2,'A','王磊',95),

(3,'A','孙科',100),

(4,'A','赵强',80),

(5,'A','王智',90),

(6,'B','李海',95),

(7,'B','王峰',84),

(8,'B','魏坤琳',77),

(9,'B','鲍云',96),

(10,'B','王昱珩',95),

(11,'C','马芸',92);

表如下

题目一: 求每个班级年龄(分数)最高的前三名

使用连接查询,连接条件:在同一个班级,s1.age<s2.age(分数最高的右表为null,因为不可能有比最高分还大的),然后根据id分组,找出分组后数量小于3的就是我们需要的结果

题目二: 将所有人的成绩从高到低排序 

比100大的是0个,比96大的是1个...,然后按ranking asc排序即可

题目三: 取出所有成绩的前三名

这个相对简单一点,只要思路清晰,用子查询就能做出来

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值