1

更新: 在下面的问题中,我认为当你选择行时,MySQL 会创建一种行索引,然后 LIMIT 和 OFFSET 子句通过它的数字切断这个列表。问题是我使用错误的值或字段组合对行进行排序,因为它们具有几乎相同的值。

这是我的错误,假设 MySQL 有很多“智能”;-)

解决办法总是有一个更可靠的排序字段作为后备,就像ID一样,像这样ORDER BY priority DESC, id ASC


这是一个严格的 MySQL 问题。为什么似乎在 ORDER BY 之前应用了 LIMIT OFFSET 子句?或者我错过了什么?

下面是示例,首先我们选择一个按优先级字段排序的行列表:

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;

结果如下所示:

在此处输入图像描述

然后我想使用以下查询从该列表中选择前 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 查询给了我这个意想不到的结果。

有什么帮助或线索吗?

谢谢!

4

1 回答 1

2

您没有得到您期望的结果,因为您的数据有许多行具有相同的优先级值。

当您对优先级使用“排序依据”时,所有具有优先级的行都可以按任何顺序排列。不能保证具有相同优先级值的排序。要解决平局,您可以在 order by 子句中添加其他字段。根据您的选择,您可以选择在“order by”子句中包含名称或 ID 字段。

于 2017-10-13T11:31:15.190 回答