通过mybatis-puls查询某学生在校平均成绩的排名情况

通过mybatis-puls查询学生在校成绩的排名情况,问题分析:

  • 涉及多表进行查询
  • 涉及mysql中的复合函数(AVG())
  • 涉及sql相关的排序

解决方案:

  • 可以通过@select注解,写相关的sql语句。来获取学生在校的平均成绩的排名
  • 也可以通过xml,写相关的sql语句。来获取学生在校的平均成绩的排名

方法一:

@select注解

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.Map;

@Mapper
public interface ScoreMapper {

    @Select("select rank from\n" +
            "(select (@ranknum:=@ranknum+1) as 'rank',avgScore,id,name\n" +
            "FROM(\n" +
            "select AVG(score.scores) as avgScore ,user.id ,`user`.`name`\n" +
            "from score left join user on score.user_id=user.id \n" +
            "GROUP BY `user`.id HAVING SUM(score.scores))a ,(select (@ranknum :=0) ) b ORDER BY avgScore DESC )ab\n" +
            "where `name`=#{name}")
    Map select(String name);
}

测试:

@SpringBootTest
class Test01ApplicationTests {

    @Autowired
    private ScoreMapper scoreMapper;

    @Test
    void contextLoads() {
        String name="小树";
        Map map=scoreMapper.select(name);
        int rank=new Double((double)map.get("rank")).intValue();
        System.out.println(name+"在校的平均成绩排名是:第"+rank+"名");
    }

}

 方法二:

xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.ScoreMapper">
    <select id="select1" parameterType="string" resultType="map">
       select rank from
          (select (@ranknum:=@ranknum+1) as 'rank',avgScore,id,name
           FROM(
                  select AVG(score.scores) as avgScore ,user.id ,`user`.`name`
                  from score left join user on score.user_id=user.id
                  GROUP BY `user`.id HAVING SUM(score.scores))a ,(select (@ranknum :=0) ) b ORDER BY avgScore DESC )ab
       where `name`=#{name}
    </select>
</mapper>

数据库:

 

 总结:

1.mybatis-plus中,lambda表达式没有某些复合函数(AVG等);

2.在书写sql语句的时候可以现在sql可视化器中先书写、运行,减少错误的产生。


版权声明:本文为abby_yaya原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。