我正在尝试使用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页:
+-----+-------+------+
| id | mot | hits |
+-----+-------+------+
| 27 | serie | 1 |
| 26 | ouest | 1 |
| 478 | vrai | 1 |
+-----+-------+------+
如您所见,第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 |
+-----+-------------+------+
也许我错过了某些东西或排序结果并且使用限制/偏移不兼容,我不知道出了什么问题。
答案 0 :(得分:8)
这里的问题是所有行的点击次数都为1
,因此使用ORDER BY hits
时它们的位置是不确定的。而且,由于每次访问页面时都会执行一个新查询,因此行将重新“加扰”。
为了保持您的网页一致,您还可以按其ID进行排序:
SELECT mot_cle.* FROM mot_cle ORDER BY hits DESC, id ASC LIMIT 3 OFFSET 0; --Page 1
答案 1 :(得分:1)
LIMIT
基本上"中止"找到足够匹配的行后查询。例如。如果您有LIMIT 2
,则只要找到与join
/ where
子句匹配的两行,查询的其余部分就会消失,您将获得这两行。
但是如果你有一个ORDER BY
,那么整个匹配结果集是有序的,那么LIMIT就会被应用到那个有序集合。
e.g。如果您有一些记录被5,10,203,3,92
返回,那么
SELECT id ... LIMIT 2 -> (5,10),203,3,92
^^^^^^---actual returned-to-client results
SELECT id ... ORDER BY id LIMIT 2 -> 3,5,10,92,203 -> (3,5),10,92,203
^^---internal-only results
^^^^--actual returned-to-client results.
答案 2 :(得分:-1)
而不是使用
Limit 3 offset 0
Limit 3 offset 3
Limit 3 offset 6
Limit 3 offset 9
你应该可以使用
Limit 0,3
Limit 3,3
Limit 6,3
Limit 9,3
达到同样的效果