多表查询导致的分页不准确问题

文章讨论了后端在处理分页查询时,如何从传统SQL查询(按照所有数据分页)转向满足实际业务需求(按老师分页)。提出了解决方案,即首先按老师分组获取每个老师的前3名学生,然后进行进一步的多表查询获取最终结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个场景,后端需要查询老师以及老师所教的学生信息(分页查询)。在业务层面,我们需要建立一个studentList去接受老师所教的学生列表

三张表,teacher表、teacher_student表、student表。

传统的分页方式:sql前使用pagehelper查询。

SELECT * FROM teacher t
left JOIN teacher_student ts on t.id = ts.teacher_id
LEFT JOIN student s ON s.id = ts.student_id

查询结果为:(总共测试数据就这么多)
在这里插入图片描述

假如我希望页面大小为3,将pagesize为3作为参数放到pagehelper中,startpage为1,实际的查询sql为

SELECT * FROM teacher t
left JOIN teacher_student ts on t.id = ts.teacher_id
LEFT JOIN student s ON s.id = ts.student_id
LIMIT 0,3

实际查询结果为

在这里插入图片描述

这与我们实际的业务需求相违背,实际需求是查询前3个老师所教的学生,上面查询结果明显不正确。原因为:这里分页查询是按照查询出来的所有条目分页,我们的需求是按照老师来分页。

解决方案:

先多表查询,按照老师分组分页,查询出真实老师数量生成新表,再将新表再进行多表查询,生成最终结果

SELECT * FROM (SELECT t.* FROM teacher t
left JOIN teacher_student ts on t.id = ts.teacher_id
LEFT JOIN student s ON s.id = ts.student_id
GROUP BY t.id
LIMIT 0,3) m
left JOIN teacher_student ts on m.id = ts.teacher_id
LEFT JOIN student s ON s.id = ts.student_id

查询结果为

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值