首先说一下问题场景:在使用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
这样问题就解决了。