想要获取每组的前n个记录,由于mysql中没有row_number() over 函数,所以自己需要通过使用mysql的语法同样实现该功能。
#建表语句
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`s_id` int(11) DEFAULT NULL,
`c_id` int(11) DEFAULT NULL,
`s_core` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES ('1', '1', '80');
INSERT INTO `score` VALUES ('1', '2', '90');
INSERT INTO `score` VALUES ('1', '3', '99');
INSERT INTO `score` VALUES ('2', '1', '70');
INSERT INTO `score` VALUES ('2', '2', '60');
INSERT INTO `score` VALUES ('2', '3', '80');
INSERT INTO `score` VALUES ('3', '1', '80');
INSERT INTO `score` VALUES ('3', '2', '80');
INSERT INTO `score` VALUES ('3', '3', '80');
INSERT INTO `score` VALUES ('4', '1', '50');
INSERT INTO `score` VALUES ('4', '2', '30');
INSERT INTO `score` VALUES ('4', '3', '20');
INSERT INTO `score` VALUES ('5', '1', '76');
3INSERT INTO `score` VALUES ('5', '2', '87');
#student表
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`sid` int(11) NOT NULL,
`sname` varchar(255) DEFAULT NULL,
`sex` varchar(255) DEFAULT NULL,
PRIMARY KEY (`sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', '赵磊', '男');
INSERT INTO `student` VALUES ('2', '千点', '男');
INSERT INTO `student` VALUES ('3', '孙峰', '男');
INSERT INTO `student` VALUES ('4', '李云', '女');
INSERT INTO `student` VALUES ('5', '周妹', '女');
#要求是:按课程类目分组,求出每组的前三位
set @rank:=0;
select a.*,b.c_id,b.s_core,b.rank from(
select *,@rank:=case when @current_id<>c_id then 1 else @rank+1 end as rank,
@current_id:=c_id from score order by c_id,s_core desc
)b
left join student a on a.sid=b.s_id
having rank<=3 order by b.c_id,rank ;
结果: