2011-06-17 61 views
0

:-) 我有這個腳本,可以從學分數中找到用戶的位置。 這一切正常,但我有一個小問題。如果兩個用戶擁有相同的學分,他們兩個都將處於相同的位置。 我可以這樣做,所以如果有更多的用戶具有相同的學分,那麼系統需要通過用戶ID進行排序,並從中給他們一個位置?如果兩個用戶擁有相同的學分數,則按ID排序

這是我到目前爲止的代碼:

$sql = "SELECT COUNT(*) + 1 AS `number` 
     FROM `users` 
     WHERE `penge` > 
         (SELECT `penge` FROM `users` 
         WHERE `facebook_id` = ".$facebook_uid.")"; 
$query_rang = $this->db->query($sql); 

所以,如果我有這樣的:

ID -------- Credits 

1 -------- 100 

2 -------- 100 

3 -------- 120 

然後等級表應該是這樣的:

1號是ID用戶3

2號用戶ID爲1

3號是與ID 2用戶

回答

1
$sql = "SELECT COUNT(*) + 1 AS `number` FROM `users` WHERE `penge` > (SELECT `penge` FROM `users` WHERE `facebook_id` = ".$facebook_uid.") ORDER BY COUNT(*) + 1 desc, users.ID"; 
$query_rang = $this->db->query($sql); 

後來編輯:

我不明白,爲什麼你仍然有相同的結果....

我做了一個快速測試。我創建了一個表:

測試:ID

我已經插入一些值(整數),否(整數):現在

id no 
1 1 
1 1 
1 1 
2 1 
3 1 
4 1 
4 1 
5 1 

,如果我跑:

SELECT 
    id, COUNT(*) + 1 AS `number` 
FROM 
    test 
GROUP BY 
    id 

我收到:

id number 
1 4 
2 2 
3 2 
4 3 
5 2 

但是,如果我添加ORDER BY:

SELECT 
    id, COUNT(*) + 1 AS `number` 
FROM 
    test 
GROUP BY 
    id 
ORDER BY 
    count(*) desc, id 

然後我得到:

id number 
1 4 
4 3 
2 2 
3 2 
5 2 
+0

+1。但'ORDER BY'中的COUNT(*)後面的'+ 1'讓我笑得很響:D – mkilmanas 2011-06-17 13:03:28

+0

它返回的結果與之前一樣:( – 2011-06-17 13:08:24

6

ORDER BY credits DESC, id ASC。這將按照信用排序並與ID斷開關係。

  • UPDATE

現在我知道你是想爲用戶的排名信息,而不只是通過信貸和IDS的用戶進行排序。這會給你的用戶和他們的排名的完整列表:

SELECT @rank:[email protected]+1 AS rank, users.id, users.facebook_id FROM users, (SELECT @rank:=0) dummy ORDER BY penge DESC, id ASC 

獲取行號是這篇博客文章解決了棘手位: http://jimmod.com/blog/2008/09/displaying-row-number-rownum-in-mysql/

相關問題