更新 在下面的问题中,我想当你选择行时,MySQL创建一种行索引,然后LIMIT和OFFSET子句按其数字切断该列表。问题是我使用错误的值或字段组合来排序行,因为它们具有几乎相同的值。
这是我的错误,假设MySQL有很多“情报”; - )
解决方案总是要有一个更可靠的排序字段作为后备,就像ID一样, ORDER BY priority DESC,id ASC
这是一个严格的MySQL问题。为什么在ORDER BY之前应用LIMIT OFFSET子句?或者我错过了什么?
以下是示例,首先我们选择一个名为priority的字段排序的行列表:
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查询给了我这个意想不到的结果。
有关最新情况的任何帮助或线索?
谢谢!
答案 0 :(得分:1)
您没有得到您期望的结果,因为您的数据有许多行具有相同的优先级值。
当您在优先级上使用'order by'时,所有具有优先级的行都可以按任何顺序排列。无法保证具有相同优先级的排序。要解决这种关系,您可以在order by子句中添加其他字段。根据您的选择,您可以选择在“order by”子句中包含name或id字段。