2013-07-08 69 views
0

我有一個查詢下面,使用排名方法基於points。問題是,如果我按順序排列,排名仍然顯示1,2,3,4等等,而不是4,3,2,1(或者如果只想獲得一個人排名(其中用戶名= name1),結果是回1,而不是他們的實際排名基於points)。我的代碼如下:Mysql排名,升序或降序

SELECT username, @n := @n + 1 ranking, `1st places`, `2nd places`, `3rd places`, `avg`, `1st places` + `2nd places` + `3rd places` AS `points` 
FROM (SELECT username, 
SUM(CASE WHEN rating = 1 THEN 10 ELSE 0 END) `1st places`, 
SUM(CASE WHEN rating = 2 THEN 5 ELSE 0 END) `2nd places`, 
SUM(CASE WHEN rating = 3 THEN 3 ELSE 0 END) `3rd places`, 
format(avg(rating),0) `avg` 

FROM contest_entries 
GROUP BY username 

) q, (SELECT @n := 0) n 
ORDER BY `points` desc 

所以我想要的東西,是能夠通過points仍然排名,但是如果我想通過ASC排名會去反... 4,3,2訂購,這可能嗎?

編輯*這是我使用上述代碼時的樣子。

username ranking 1st places 2nd places 3rd places avg points 
name3   1  10    5   0  1 15 
name1   2  10    0   0  1 10 
name2   3  0    0   0  6  0 

然而,當爲了通過點遞增,這是結果:

username ranking 1st places 2nd places 3rd places avg points 
name2   1  0    0   0  6 0 
name1   2  10    0   0  1 10 
name3   3  10    5   0  1 15 

的點是在倒車時,但排名保持不變。

+0

請提供測試數據和你所期望的輸出。 – dcp

+0

你想用'mysql'做什麼?ASC應該顯示DESC你睡得好嗎? –

+0

select查詢沒有提及'point',它是表的一部分嗎?你可能需要用'as point'來命名一些搜索字段 –

回答

0
select * from 
(SELECT username, @n := @n - 1 ranking, `1st places`, `2nd places`, `3rd places`, `avg`, `1st places` + `2nd places` + `3rd places` AS `points` 
FROM (SELECT username, 
SUM(CASE WHEN rating = 1 THEN 10 ELSE 0 END) `1st places`, 
SUM(CASE WHEN rating = 2 THEN 5 ELSE 0 END) `2nd places`, 
SUM(CASE WHEN rating = 3 THEN 3 ELSE 0 END) `3rd places`, 
format(avg(rating),0) `avg` 

FROM contest_entries 
GROUP BY username 

) q, (SELECT @n := count(distinct username)+1 from contest_entries) n 
ORDER BY `points` asc) resultset 
order by ranking asc; 

fiddle

如果你需要添加條件:

select * from 
(SELECT username, @n := @n - 1 ranking, `1st places`, `2nd places`, `3rd places`, `avg`, `1st places` + `2nd places` + `3rd places` AS `points` 
FROM (SELECT username, 
SUM(CASE WHEN rating = 1 THEN 10 ELSE 0 END) `1st places`, 
SUM(CASE WHEN rating = 2 THEN 5 ELSE 0 END) `2nd places`, 
SUM(CASE WHEN rating = 3 THEN 3 ELSE 0 END) `3rd places`, 
format(avg(rating),0) `avg` 

FROM contest_entries 
GROUP BY username 

) q, (SELECT @n := count(distinct username)+1 from contest_entries) 
n 
ORDER BY `points` asc) resultset where username = 'name1' 
order by ranking asc; 

fiddle

+0

代碼錯誤:「... right 語法使用near *'from contest_entries)n ORDER BY點asc'在第11行」 –

+0

用不同的用戶名替換*。現在就試試。 –

+0

那真的沒有得到我想要的,但我有一種感覺,你在正確的軌道上。當我想選擇一個用戶名「where username = name2」時,它會爲每個人帶回「2」的等級。 –