MySQL order by同值随机排序导致分页展示重复
2021-01-29 本文已影响0人
xiaogp
摘要:MySQL
,flask-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)