模拟MySQL的有两个条件等级(无级)

问题描述 投票:0回答:1

从这个答案来:Rank based on two columns

我有下面的例子:

CREATE TABLE tmpPoradi 
    (`player` int, `wins` int, `diff` int)
;

INSERT INTO tmpPoradi 
    (`player`, `wins`, `diff`)
VALUES
    (1, 10, 12),
    (2, 8, 2),
    (3, 10, 10),
    (4, 8, 1),
    (5, 8, 7),
    (6, 10, 14),
    (8, 10, 10),
   (7, 12, 3)
;

和期望的结果必须是:

+--------+------+------+------+
| player | wins | diff | rank |
+--------+------+------+------+
|      7 |   12 |    3 |    1 |
|      6 |   10 |   14 |    2 |
|      1 |   10 |   12 |    3 |
|      3 |   10 |   10 |    4 |
|      8 |   10 |   10 |    4 |
|      5 |    8 |    7 |    5 |
|      2 |    8 |    2 |    6 |
|      4 |    8 |    1 |    7 |
+--------+------+------+------+

问题是,原来的答案返回的行数:

 SELECT player, wins, diff,rank from
 (
 SELECT player, wins, diff, @winrank := @winrank + 1 AS rank
 from tmpPoradi,(SELECT @winrank := 0) r 
 ORDER BY wins DESC,diff DESC
 )  rt
ORDER BY rank 

收益:

+---------+-------+-------+-------+
|  player |  wins |  diff |  rank |
+---------+-------+-------+-------+
|       7 |    12 |     3 |     1 |
|       6 |    10 |    14 |     2 |
|       1 |    10 |    12 |     3 |
|       3 |    10 |    10 |     4 |
|       8 |    10 |    10 |     5 |
|       5 |     8 |     7 |     6 |
|       2 |     8 |     2 |     7 |
|       4 |     8 |     1 |     8 |
+---------+-------+-------+-------+

我与条件尝试返回以下结果:(不知道为什么)

  SELECT player, wins, diff,rank from
 (
 SELECT player, wins, diff, @winrank := IF(wins = diff,@winrank,@winrank + 1) AS rank
 from tmpPoradi,(SELECT @winrank := 0) r 
 ORDER BY wins DESC,diff DESC
 )  rt
ORDER BY rank 


+---------+-------+-------+-------+
|  player |  wins |  diff |  rank |
+---------+-------+-------+-------+
|       7 |    12 |     3 |     1 |
|       6 |    10 |    14 |     2 |
|       3 |    10 |    10 |     3 |
|       8 |    10 |    10 |     3 |
|       1 |    10 |    12 |     3 |
|       5 |     8 |     7 |     4 |
|       2 |     8 |     2 |     5 |
|       4 |     8 |     1 |     6 |
+---------+-------+-------+-------+

所以问题是:

什么我做错了,并通过胜如何实现排名,然后如果胜绑,subrank的差异,然后如果DIFF都系,职级是一样的吗?

mysql ranking dense-rank
1个回答
1
投票

SQL DEMO

  SELECT player, wins, diff, dense_rank, rank, dense_val, prev_wins, prev_diff
  FROM
     (
         SELECT player, 
                wins,                 
                diff, 
                @dense_rank := IF(wins = @prev_wins and diff = @prev_diff, @dense_rank, @dense_rank + @dense_val ) AS dense_rank,                
                @dense_val  := IF(wins = @prev_wins and diff = @prev_diff, @dense_val + 1 , 1) as dense_val,
                @rank := @rank + 1 as rank,
                @prev_wins := wins as prev_wins,
                @prev_diff := diff as prev_diff

         FROM tmpPoradi,(SELECT @dense_rank := 0, @dense_val := 1, @rank := 0, @prev_wins := 0, @prev_diff := 0) r 
         ORDER BY wins DESC,diff DESC
     )  rt
  ORDER BY rank 

OUTPUT

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.