我正在尝试使用SQL设置分页。我想要每页3个结果,这是我所做的:
SELECT mot_cle.* FROM mot_cle ORDER BY hits DESC LIMIT 3 OFFSET 0; --Page 1 SELECT mot_cle.* FROM mot_cle ORDER BY hits DESC LIMIT 3 OFFSET 3; --Page 2 SELECT mot_cle.* FROM mot_cle ORDER BY hits DESC LIMIT 3 OFFSET 6; --Page 3 SELECT mot_cle.* FROM mot_cle ORDER BY hits DESC LIMIT 3 OFFSET 9; --Page 4
我检查了很多次,这不是很复杂,但是我的结果并不是我所期望的:
第1页:
+-----+--------+------+ | id | mot | hits | +-----+--------+------+ | 2 | test | 46 | | 1 | blabla | 5 | | 475 | intro | 3 | +-----+--------+------+
第2页 :
+-----+-------+------+ | id | mot | hits | +-----+-------+------+ | 478 | vrai | 1 | | 26 | ouest | 1 | | 27 | serie | 1 | +-----+-------+------+
第3页:
+-----+-------+------+ | id | mot | hits | +-----+-------+------+ | 27 | serie | 1 | | 26 | ouest | 1 | | 478 | vrai | 1 | +-----+-------+------+
第4页:
如您所见,第2、3和4页的结果相同…当我一次取4页时:
SELECT mot_cle.* FROM mot_cle ORDER BY hits DESC LIMIT 20 OFFSET 0;
结果 :
+-----+-------------+------+ | id | mot | hits | +-----+-------------+------+ | 2 | test | 46 | | 1 | blabla | 5 | | 475 | intro | 3 | | 35 | acteurs | 1 | | 36 | milieu | 1 | | 37 | industriel | 1 | | 38 | plaire | 1 | | 39 | grandes | 1 | | 40 | ingenieries | 1 | | 41 | francaises | 1 | | 34 | partenaire | 1 | | 33 | rthgyjhkj | 1 | | 32 | cool | 1 | | 31 | super | 1 | | 30 | vieux | 1 | | 29 | moteur | 1 | | 28 | yahoo | 1 | | 27 | serie | 1 | | 26 | ouest | 1 | | 478 | vrai | 1 | +-----+-------------+------+
也许我遗漏了一些东西或排序结果以及使用限制/偏移量不兼容,我不知道出了什么问题。
这里的问题是所有行的命中计数均为1,因此使用时它们的位置ORDER BY hits是不确定的。并且由于您每次访问页面时都会执行一个新查询,因此这些行将被重新“加扰”。
1
ORDER BY hits
为了保持页面的一致性,您还可以按其ID排序:
SELECT mot_cle.* FROM mot_cle ORDER BY hits DESC, id ASC LIMIT 3 OFFSET 0; --Page 1