zoukankan      html  css  js  c++  java
  • 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

    效果图

  • 相关阅读:
    浮点数越界或者无效1.#IND0
    [转]方差、协方差与相关系数
    『转』 函数、变量命名方法
    感知哈希算法——google用于图片搜索的算法
    C#传值调用与引用调用 解释
    HttpContext.Current.Request.ServerVariab
    怎么去用java经典递归算法?
    泛型的详细解释与示例
    个彻底解释 C#泛型的源代码
    VC++怎么实现Win2000下直接读写磁盘扇区
  • 原文地址:https://www.cnblogs.com/MarsPanda/p/8268748.html
Copyright © 2011-2022 走看看