MySQL order by同值随机排序导致分页展示重复

摘要:MySQLflask-sqlalchemy

问题复现

使用flask-sqlalchemy对MySQL表进行操作,对score字段进行排序,输出分页对象paginate,page_num=10。

paginate = PiraScore.query.filter(PiraScore.datetime == '2020-12-07')\
                .order_by(PiraScore.score.desc())\
                .with_entities(PiraScore.ent_name, PiraScore.score)\
                .paginate(page, page_num, False)

在前端查看分页效果,第一页


第一页.png

第二页重复出现同一条数据


第二页.png

问题分析

  • 原因:排序后的前两页都是同分的数据,MySQL的ORDER BY在处理排序列中有多个行具有相同的值时,是自由以任何顺序返回这些行,并且根据整体执行计划的不同,返回值可能会有所不同。 换句话说,这些行的前后顺序是不确定的

  • 导致结果:会导致在分页中不同的页出现重复的数据,同时由于重复数据占据了位置,原有的其他数据丢失

解决方案

在ORDER BY子句中加入其他列使的顺序确定,比如加入主键id,修改如下

paginate = PiraScore.query.filter(PiraScore.datetime == '2020-12-07')\
                .order_by(PiraScore.score.desc(), PiraScore.id)\
                .with_entities(PiraScore.ent_name, PiraScore.score)\
                .paginate(page, page_num, False)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容