Mybatis-plus分页插件配合导致distinct无效

首先说一下问题场景:在使用mybatis-plus进行分页,分页数据是一个一对多的查询结果集,并且,结果集的sql使用了ditsinct,结果distinct没有去重。

比如现在有一个班级表和一个学生信息表,学生信息表一个学生的信息可能有多条(比如张三家庭住址一条记录,张三兴趣爱好一条记录,一共两条记录),所以班级表 inner join 学生信息表,就变成了一个学生信息会有多条。

我现在就想统计一下学生信息表中有多少学生,sql类似如:

select distinct 班级id,班级名称,姓名
from 班级表
inner join 学生信息表 on 班级表.班级ID = 学生信息表.班级ID

这样的sql,直接在数据库客户端执行是没问题的,但是如果是在应用中,基于mybatis-plus分页插件查询结果,就会产生重复数据,也就是distinct无效了。

最终查询结果是学生信息表有几条记录,结果集就是几条数据。

分页插件我们都知道其实是在我们的sql上进行了一层包装,最终的sql如下:

WITH selectTemp AS (
	SELECT DISTINCT
		TOP 100 PERCENT ROW_NUMBER() OVER ( ORDER BY CURRENT_TIMESTAMP ) AS __row_number__,
		班级id,班级名称,姓名
		from 班级表
		inner join 学生信息表 on 班级表.班级ID = 学生信息表.班级ID
	) SELECT
	* 
FROM
	selectTemp 
WHERE
	__row_number__ BETWEEN 1 
	AND 10 
ORDER BY
	__row_number__

由此看出,distinct被抽走了,挪到了上一层,然后还有ROW_NUMBER()为每一行分配一个行号,这样去重肯定是没效果的。

处理方法也很简单,把我们的sql套一层:

select * from (
  select distict 班级id,班级名称,姓名
		from 班级表
		inner join 学生信息表 on 班级表.班级ID = 学生信息表.班级ID
) a

这样问题就解决了。