2013-10-11 84 views
2

排名我有一個點表與一些列的是:MySQL的使用GROUP BY和SUM

| user_id | points | 
-------------------- 
| 1  | 10 | 
| 5  | 10 | 
| 5  | 50 | 
| 3  | 15 | 
| 3  | 10 | 

我想獲得排名的與MySQL每個用戶。

我看到這篇文章MySQL get row position in ORDER BY但它沒有SUM,我不能讓它與SUM一起工作。

我希望能夠得到給定user_id的排名。

在此先感謝您的幫助!

回答

4

提醒OP的問題:

我希望能夠得到一個給定的user_id軍銜。

爲了在實際執行操作@rank你有用戶的另一個派生表(是的,它是低效的,這就是爲什麼它是最好不要在MySQL處理此):

SELECT * FROM (
    SELECT s.*, @rank := @rank + 1 rank FROM (
    SELECT user_id, sum(points) TotalPoints FROM t 
    GROUP BY user_id 
) s, (SELECT @rank := 0) init 
    ORDER BY TotalPoints DESC 
) r 
WHERE user_id = 3 

輸出

| USER_ID | TOTALPOINTS | RANK | 
|---------|-------------|------| 
|  3 |   25 | 2 | 

的方法基本上是:

  1. 獲取的總額分每用戶
  2. 排序的總積分排名
  3. 過濾器,一旦你有秩(否則,排名將受到損害)

小提琴here

+1

感謝您的完整的答案。我不擅長子查詢:D – nebulousGirl

3

試試這個::

SELECT @rownum:[email protected] + 1 as row_number, 
     t.* 
FROM ( 

select user_id, SUM(points) as Addedpoint 
from mytable group by user_id order by Addedpoint desc 

) t, 
(SELECT @rownum := 0) r 
0
select 
@rownum := @rownum + 1 AS position, 
user_id, 
total_points 

from 
(select user_id, sum(points) as total_points from table)a 
join 
(SELECT @rownum := 0) r 
order by total_points desc 
0

使用用戶變量,你可以做這樣的事情: -

SELECT user_id, tot_points, @Rank:[email protected] + 1 AS user_rank 
FROM 
(
    SELECT user_id, SUM(points) AS tot_points 
    FROM SomeTable 
    GROUP BY user_id 
    ORDER BY tot_points DESC 
) Sub1 
CROSS JOIN (SELECT @Rank:=0) Sub2 
1

可以實現與子查詢,在其內部應該算你的總和:

SELECT 
    @rank:[email protected]+1 AS rank, 
    user_id, 
    total_points 
FROM 
    (SELECT 
    user_id, 
    SUM(points) AS total_points 
    FROM t 
    GROUP BY 
    user_id) AS sum_points 
CROSS JOIN 
    (SELECT @rank:=0) AS init 
ORDER BY 
    sum_points.total_points DESC 

-see my fiddle