一个场景,后端需要查询老师以及老师所教的学生信息(分页查询)。在业务层面,我们需要建立一个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
查询结果为