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

    效果图

  • 相关阅读:
    IE设置cookie问题。
    正则表达式。
    Git和SVN区别
    点滴MarkDown~
    浏览器页面是否缩放问题。
    我理解的灰度发布。
    有衬线字体和无衬线字体
    移动开发规范
    Thunderbird 如何接收 Foxmail 发出的会议邀请。。
    移动端 CSS sprites 的 background-size 如何计算的。
  • 原文地址:https://www.cnblogs.com/MarsPanda/p/8268748.html
Copyright © 2011-2022 走看看