这是我的数据库数据样本:
这两列都是 int
tuanId ,tuanSort
'375579', '55'
'370576', '54'
'366222', '54'
...
'346268', '52'
'369608', '52'
'370587', '52'
'370775', '52'
...
'370225', '52'
'370588', '52'
'360758', '52'
'366390', '51'
我试试这些sqls:
SELECT * FROM `tuan`.`TuanItem` WHERE ... ORDER BY `tuanSort` DESC LIMIT 140,20;
SELECT * FROM `tuan`.`TuanItem` WHERE ... ORDER BY `tuanSort` DESC LIMIT 160,20;
我得到这些错误的数据,我想做一个分页,但第二页在第一页有一些相同的数据:
例如,第一张图片的第17行在2张图片中显示了两次
那么,排序值是否会导致这样的问题呢?或MySQL有这样的选择问题?
答案 0 :(得分:2)
鉴于tuanSort
不是唯一的,行为在规范范围内。
您正在观察一个查询将特定行返回为第157行。在另一个查询执行中,它作为第161行返回。
要获得更多确定性序列,请在ORDER BY子句中指定其他列,例如
ORDER BY tuanSort DESC, tuanId DESC
如果这一系列语句背后的意图是“分页”,则有更有效的方法,例如从前一页的“最后”行保存唯一的,有序的标识符。
如果tuanSort,tuanId
元组是唯一的......
WHERE tuanSort <= :last_tuanSort
AND ( tuanSort < :last_tuanSort OR tuanId < :last_tuanId )
AND ...
ORDER BY tuanSort DESC, tuanId DESC
LIMIT 20
如果您获取所有二十行,请从最后一行保存tuanSort
和tuanId
。在下一个“页面”上,在查询谓词中提供这些保存的值。
但这是你没有问过的问题的答案。
答案 1 :(得分:0)
我认为您需要刷新数据库表。
试试这个:Go - &gt; TuanItem-&gt;点击操作 - &gt;通过&gt;更改表格顺序选择你的tuanid并设置为升序。
答案 2 :(得分:0)
我认为您的问题是,您在2次查询中获得相同的数据。
然后将limit 160,20
更改为
SELECT * FROM `tuan`.`TuanItem` WHERE ... ORDER BY `tuanSort` DESC LIMIT 140,0;
SELECT * FROM `tuan`.`TuanItem` WHERE ... ORDER BY `tuanSort` DESC LIMIT 160,141;
0表示偏移量,表示数据从0开始,第二个查询从141开始,因此无法获得相同的值两次