2017-10-13 82 views
1

更新: 在以下问题中,我认为当您选择行时,MySQL创建一种行索引,然后LIMIT和OFFSET子句通过其数字切断此列表。问题是我使用错误的值或字段组合排序行具有几乎相同的值。已订购分页与MySQL

这里是我的错误,假设到多“智能”形式的MySQL ;-)

解决的办法是始终有一个更可靠的分拣场作为备用,如ID,像这样ORDER BY优先降序,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; 

结果如下:

enter image description here

然后我想选择该列表的前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; 

我已经得到了这样的结果:

enter image description here

为什么没有这样的例子不胜枚举,从“Grandvalira的”到“内华达山脉”?

这个问题,不是实际的顺序,但一些行从来没有达到!像“Vallnord Ordino-Arcalís”。当我更改OFFSET值时,它不会遍历所有行,并且它会重复某些行。

这是最基本的问题。但是当使用Symfony的“KnpPaginatorBundle(2.5.3)”时,这给我带来了问题。我认为是PHP代码的问题,但mysql查询给我这个意想不到的结果。

任何帮助或线索怎么回事?

谢谢!

+0

您的问题太麻烦IMO给我一个答案,但我不明白范围“Grandvalira”到“Sierra Nevada”的意义是什么?在完整的按字母排序的列表中,这两个位置都不是第一个或最后一个。尝试简化您的问题,并且切中要害。 –

回答

1

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

当您使用'order by'优先级时,所有具有优先级的行都可以按任意顺序排列。对于具有相同优先级值的排序不保证。要解决这个问题,你可以在你的order by子句中添加额外的字段。根据您的选择,您可以选择在'order by'条款中包含名称或ID字段。

+0

你是对的,我刚刚遇到了这个问题。我需要添加更可靠的排序字段。例如,如果我使用该ID,它的作品。 –