2017-10-13 95 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,它的作品。 –