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

问题复现

使用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)

问题分析

  • 原因:排序后的前两页都是同分的数据,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)


推荐 收藏
评论(0) 阅读(361)
刷新评论 返回顶部
光圈爱漫游最新博客