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

    效果图

  • 相关阅读:
    学习Windows(BAT)、Linux(Shell)编程,并分别写一个脚本文件解决自己的一个问题
    国外著名黑客信息
    设置电脑护眼配色,减少电脑对眼睛的伤害(转)
    Java基础学习笔记
    [转] java正则表达式中的数量词
    JAVA学习间项目笔记
    [转]Java堆和栈的区别 经典总结
    Delphi下Webbrowser的使用技巧
    Pascal精要笔记
    网页元素特征字符串
  • 原文地址:https://www.cnblogs.com/MarsPanda/p/8268748.html
Copyright © 2011-2022 走看看