Mysql 使用orderby和limit的奇怪结果
我正在尝试使用SQL设置分页。我希望每页有3个结果,以下是我所做的:Mysql 使用orderby和limit的奇怪结果,mysql,sql,select,sql-order-by,sql-limit,Mysql,Sql,Select,Sql Order By,Sql Limit,我正在尝试使用SQL设置分页。我希望每页有3个结果,以下是我所做的: 从mot\u-cle中选择mot\u-cle.* 按点击次数顺序描述限制3偏移量0--第1页 从mot_-cle中选择mot_-cle.* 按点击次数顺序描述限制3偏移量3--第2页 从mot_-cle中选择mot_-cle.* 按点击次数顺序描述限制3偏移量6--第3页 选择运动。* 来自mot_cle 按点击次数顺序描述限制3偏移量9--第4页 我检查了很多次,这并不复杂,但我的结果并不是我所期望的: 第1页: +---
从mot\u-cle中选择mot\u-cle.*
按点击次数顺序描述限制3偏移量0--第1页
从mot_-cle中选择mot_-cle.*
按点击次数顺序描述限制3偏移量3--第2页
从mot_-cle中选择mot_-cle.*
按点击次数顺序描述限制3偏移量6--第3页
选择运动。*
来自mot_cle
按点击次数顺序描述限制3偏移量9--第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页时:
从mot\u-cle中选择mot\u-cle.*
按点击次数顺序描述限制20偏移量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 |
+-----+-------------+------+
可能我丢失了一些东西,或者排序结果与使用限制/偏移不兼容,我不知道是什么问题。而不是使用
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
同样这里的问题是所有行的命中计数都是
1
,因此使用按命中排序时它们的位置是不确定的。由于每次访问页面时都执行一个新的查询,因此这些行将被重新“置乱”
为了保持页面的一致性,您还可以按其id排序:
SELECT mot_cle.* FROM mot_cle ORDER BY hits DESC, id ASC LIMIT 3 OFFSET 0; --Page 1
LIMIT
一旦找到足够的匹配行,基本上会“中止”查询。例如,如果您有LIMIT 2
,那么只要找到了与join
/where
子句匹配的两行,查询的其余部分就会消失,您就会得到这两行
但是如果其中有一个
ORDER BY,则整个匹配结果集都已排序,然后限制将应用于该排序集
e、 g.如果您有一些记录将作为5,10203,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.
这并不是对所问问题的回答。是的,这是
LIMIT
子句的替代语法,但这并不能解释OP观察到的行为。进行此更改不会对返回的行产生任何影响。您观察到的行为在规范范围内。您缺少的是ORDER by
子句中的第二个表达式,用于确定顺序。行按“点击次数”
“排序”,但有多行的点击次数的值相同。MySQL可以自由返回匹配值为hits
的行,其顺序可以任意。要以确定的顺序返回这些行,请向ORDERBY子句中添加一些表达式,这些表达式的组合对于一行来说是唯一的。看起来id
列可能是唯一的。例如,。。。订单按点击次数描述,id描述限制…
这是否回答了您的问题?