Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用orderby和limit的奇怪结果_Mysql_Sql_Select_Sql Order By_Sql Limit - Fatal编程技术网

Mysql 使用orderby和limit的奇怪结果

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页: +---

我正在尝试使用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页:

+-----+--------+------+
| 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描述限制…
这是否回答了您的问题?