簡體   English   中英

在mysql中,根據用戶在多行中的總得分對他們進行排名

[英]Rank users in mysql by their total points across multiple rows

我對此問題有非常相似的要求。

按用戶等級對mysql中的用戶進行排名

唯一的區別是我的數據。 上面的問題具有數據,其中表每個學生只有一行。 但在我的情況下,表格可能會像這樣為單個學生包含多行

  • 學生1分80
  • 學生2分77.5
  • 學生2分4.5
  • 學生3分77
  • 學生4分77

所以,現在排名應根據計算SUM點(總),其用戶。 因此,在這種情況下,結果將會是。

  • 學生2得1分82分
  • 學生1等級2得80分
  • 學生3得3分,排名3
  • 學生4得分3(77分)

SQL數據提琴

我嘗試了上述問題的解決方案,但沒有得到結果。 任何幫助,將不勝感激。

在我之前的答案中使用相同的查詢,只需將表格Student更改為子查詢即可合並每個學生的所有記錄

change [student er]  for 

(SELECT `id`, SUM(`points`) as `points`
 FROM students 
 GROUP BY `id`) er

SQL演示

select er.*,
       (@rank := if(@points = points, 
                    @rank, 
                    if(@points := points,    
                       @rank + 1, 
                       @rank + 1                       
                      )
                   )                  
       ) as ranking
from (SELECT `id`, SUM(`points`) as `points`
      FROM students 
      GROUP BY `id`) er cross join
     (select @rank := 0, @points := -1) params
order by points desc;

輸出值

| id | points | ranking |
|----|--------|---------|
|  5 |     91 |       1 |
|  6 |     81 |       2 |
|  1 |     80 |       3 |
|  2 |     78 |       4 |
|  3 |     78 |       4 |
|  4 |     77 |       5 |
|  7 |     66 |       6 |
|  8 |     15 |       7 |

嘗試這個:

select id, points, @row := ifnull(@row, 0) + diff rank
from (select *, ifnull(@prev, 0) != points diff, @prev := points
      from (select id, sum(points) points
            from students
            group by 1
            order by 2 desc) x) y

參見SQLFiddle

編輯:(這應該工作)

SELECT I.Id, I.Points, Rk.Rank
FROM
(SELECT Id, Points, @Rk := @Rk+1 As Rank
FROM (SELECT id, SUM(points) AS Points
      FROM students
      GROUP BY id
      ORDER BY Points DESC) As T,
      (SELECT @Rk := 0) AS Rk) As I
INNER JOIN
(SELECT * 
FROM (
    SELECT Id, Points, @Rk2 := @Rk2+1 As Rank
    FROM (SELECT id, SUM(points) AS Points
          FROM students
          GROUP BY id
          ORDER BY Points DESC) As T1,
          (SELECT @Rk2 := 0) AS Rk) AS T2
GROUP BY Points) As Rk
USING(Points)

輸出將是:

| Id | Points |   Rank  |
|----|--------|---------|
|  5 |     91 |       1 |
|  6 |     81 |       2 |
|  1 |     80 |       3 |
|  2 |     78 |       4 |
|  3 |     78 |       4 |
|  4 |     77 |       6 |
|  7 |     66 |       7 |
|  8 |     15 |       8 |

在第4位的兩個ID之后,您將獲得第6位,因為5個ID在第6位之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM