2014-09-29 38 views
0

我最近創建了一個問題,雖然它沒有措辭良好,沒有示例,但一位成員建議我應該重新創建問題,因爲過去沒有答案。MySQL PDO;從排序的結果中獲取排名,並且它的唯一位置

我想從有序查詢中獲得一個行的位置,以最有效的方式。我計劃搜索超過10,000條結果,所以我需要儘可能高效。

我現在有

SELECT p.*, 
    (SELECT count(DISTINCT prank)+1 
    FROM uprofile WHERE prank > p.prank 
    ) AS POSITION 
    FROM uprofile p 
    WHERE uid = " . $profile->data()->uid . " 
    ORDER BY prank DESC 

應該輸出位置2; uid是值31,並且具有uid值爲'31'的uprofile行具有第二大玩家惡作劇(惡作劇)。

這一切都很好,除了兩行具有相同的聲譽。我目前的數據,只有3行填充玩家等級。其餘的虛擬行將惡作劇設置爲0,這導致它們的位置全部爲4.

如何修改SQL以返回唯一值,而不是具有相同位置的某些行?

+0

發現的例子,因爲它似乎順序由惡作劇遞減定義,只是使用的各種各樣一個「ROW_NUMBER」 ......類似的反應:http://stackoverflow.com/questions/1895110/row-number-in-mysql – xQbert 2014-09-29 18:50:37

回答

0

MySQL不支持ROW_NUMBER,但你可以通過使用模擬了下列文件:

SET @Position=0; 

SELECT p.*, @Position:[email protected]+1 POSITION 
FROM uprofile p 
WHERE uid = " . $profile->data()->uid . " 
ORDER BY prank DESC; 

似乎所有你以後就是數字1-X,其中X是uprofile最大行數。看起來你不關心用戶被分配到哪個行號時,只要他們是連續的,惡作劇對用戶來說是一樣的。以上應該處理...

工作在MySQL變量的使用在這Stack response

+0

嘿,那裏,謝謝你的迴應。我試過了,儘管它根本沒有返回任何行。不幸的是,我不確定它有什麼不對。 – 2014-09-29 19:05:59

+0

分解。首先消除where子句並查看是否得到結果。如果您仍然沒有在最後的「堆棧響應」中查看該鏈接,那麼我可能會輸錯一些東西。 – xQbert 2014-09-29 19:08:03

+0

刪除where子句也不會返回任何內容,與使用鏈接的響應相同。 – 2014-09-29 20:59:58