使用 MySQL 的有序分页
Ordered pagination with MySQL
更新:
在下面的问题中,我认为当您 select 行时,MySQL 创建一种行索引,然后 LIMIT 和 OFFSET 子句按其编号切断该列表。问题是我使用错误的值或字段组合对具有几乎相同值的行进行排序。
这是我的错误,假设很多 "intelligence" 形式 MySQL ;-)
解决方案总是有一个更可靠的排序字段作为后备,比如ID,像这样ORDER BY priority DESC, id ASC
这是一道严格的 MySQL 题。为什么 LIMIT OFFSET 子句似乎在 ORDER BY 之前应用?或者我错过了什么?
这是示例,首先我们 select 一个按名为优先级的字段排序的行列表:
SELECT d0_.name, d0_.id AS id_0, d0_.priority AS priority_1 FROM destination d0_ WHERE d0_.active = 1 ORDER BY d0_.priority DESC;
结果如下所示:
然后我想 select 使用以下查询从此列表中的前 10 行:
SELECT d0_.name, d0_.id AS id_0, d0_.priority AS priority_1 FROM destination d0_ WHERE d0_.active = 1 ORDER BY d0_.priority DESC LIMIT 10 OFFSET 10;
我得到了这个结果:
为什么列表不是从 "Grandvalira" 到 "Sierra nevada"?
这个问题,不是实际的顺序,而是一些行永远不会到达!喜欢 "Vallnord Ordino-Arcalís"。当我更改 OFFSET 值时,它不会遍历所有行,并且会重复一些行。
这是基本问题。但这最终在使用 Symfony 的 "KnpPaginatorBundle (2.5.3)" 时给我带来了问题。我认为是 php 代码的问题,但是 mysql 查询给出了我意想不到的结果。
有什么帮助或线索吗?
谢谢!
您没有得到预期的结果,因为您的数据有许多行具有相同的优先级值。
当您使用 'order by' 优先级时,所有具有优先级的行都可以按任意顺序出现。无法保证具有相同优先级值的排序。要解决平局,您可以向 order by 子句中添加其他字段。根据您的选择,您可以选择在 'order by' 子句中包含名称或 ID 字段。
更新: 在下面的问题中,我认为当您 select 行时,MySQL 创建一种行索引,然后 LIMIT 和 OFFSET 子句按其编号切断该列表。问题是我使用错误的值或字段组合对具有几乎相同值的行进行排序。
这是我的错误,假设很多 "intelligence" 形式 MySQL ;-)
解决方案总是有一个更可靠的排序字段作为后备,比如ID,像这样ORDER BY priority DESC, id ASC
这是一道严格的 MySQL 题。为什么 LIMIT OFFSET 子句似乎在 ORDER BY 之前应用?或者我错过了什么?
这是示例,首先我们 select 一个按名为优先级的字段排序的行列表:
SELECT d0_.name, d0_.id AS id_0, d0_.priority AS priority_1 FROM destination d0_ WHERE d0_.active = 1 ORDER BY d0_.priority DESC;
结果如下所示:
然后我想 select 使用以下查询从此列表中的前 10 行:
SELECT d0_.name, d0_.id AS id_0, d0_.priority AS priority_1 FROM destination d0_ WHERE d0_.active = 1 ORDER BY d0_.priority DESC LIMIT 10 OFFSET 10;
我得到了这个结果:
为什么列表不是从 "Grandvalira" 到 "Sierra nevada"?
这个问题,不是实际的顺序,而是一些行永远不会到达!喜欢 "Vallnord Ordino-Arcalís"。当我更改 OFFSET 值时,它不会遍历所有行,并且会重复一些行。
这是基本问题。但这最终在使用 Symfony 的 "KnpPaginatorBundle (2.5.3)" 时给我带来了问题。我认为是 php 代码的问题,但是 mysql 查询给出了我意想不到的结果。
有什么帮助或线索吗?
谢谢!
您没有得到预期的结果,因为您的数据有许多行具有相同的优先级值。
当您使用 'order by' 优先级时,所有具有优先级的行都可以按任意顺序出现。无法保证具有相同优先级值的排序。要解决平局,您可以向 order by 子句中添加其他字段。根据您的选择,您可以选择在 'order by' 子句中包含名称或 ID 字段。