• MySQL分组查询获取每个学生前n条分数记录(分组查询前n条记录)


    CREATE TABLE `t_test` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `stuid` varchar(36) NOT NULL,
      `score` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
    INSERT INTO `testdb`.`t_test` (`id`, `stuid`, `score`) VALUES ('1', '111', '90');
    INSERT INTO `testdb`.`t_test` (`id`, `stuid`, `score`) VALUES ('2', '111', '11');
    INSERT INTO `testdb`.`t_test` (`id`, `stuid`, `score`) VALUES ('3', '111', '34');
    INSERT INTO `testdb`.`t_test` (`id`, `stuid`, `score`) VALUES ('4', '111', '99');
    INSERT INTO `testdb`.`t_test` (`id`, `stuid`, `score`) VALUES ('5', '222', '11');
    INSERT INTO `testdb`.`t_test` (`id`, `stuid`, `score`) VALUES ('6', '222', '33');
    INSERT INTO `testdb`.`t_test` (`id`, `stuid`, `score`) VALUES ('7', '222', '41');
    INSERT INTO `testdb`.`t_test` (`id`, `stuid`, `score`) VALUES ('8', '333', '123');
    INSERT INTO `testdb`.`t_test` (`id`, `stuid`, `score`) VALUES ('9', '333', '100');
    INSERT INTO `testdb`.`t_test` (`id`, `stuid`, `score`) VALUES ('10', '333', '99');

    测试数据

    SELECT *,
    (SELECT count(id) FROM t_test t2
    where t1.stuid=t2.stuid AND 
    t2.score>t1.score -- 获取t2大于t1的记录数
    )as maxcnt
     from t_test t1

    到这一步就很简单了.其实只要根据情况取macnt的数据就行了,如果要取前2条,那么筛选maxcnt<2的数据即可.

    (如111学生大于99的有0条,大于90的有1条,大于34的有2条,那么要取最高分的前3条,就是maxcnt<3)

    SELECT *
     FROM t_test t1
    WHERE
    (
    SELECT count(id) FROM t_test t2
    where t2.stuid=t1.stuid and t2.score>t1.score
    )<3
    ORDER BY stuid asc,score DESC

    效果图

  • 相关阅读:
    jquery的优势
    基于指纹识别技术的超市储物箱设计
    jquery核心
    jquery中的筛选
    红包算法设计
    jquery中trim() 去掉收尾空格
    jquery中效果的创建
    项目缓存
    StringUtils方法全集
    IE8下onclick事件不支持
  • 原文地址:https://www.cnblogs.com/MarsPanda/p/8268748.html
Copyright © 2020-2023  润新知