1

我对 MYSQL 相当陌生,并且无法让密集排名正常工作,我希望有人能够帮助调整我的查询以获得所需的结果。我遇到的问题是在排名相同之后它会转到下一个数字而不是跳过一个数字。我在下面显示了当前结果和预期结果。

        SELECT  gameid,
            score
         , IF(score <> @pscore,@i:=@i+1,@i:=@i) rank
         , @pscore := score          
        FROM playerstats x
        , (SELECT @i:=0,@prev:='',@pscore:='') vars 
        ORDER 
        BY score DESC;

当前结果:

当前结果

期望的结果:

期望的结果

4

2 回答 2

1

基本上,您需要先对 tdata 进行排序,然后再对其进行排名。 MySQL

CREATE TABLE playerstats  (
  `Score` INTEGER,
  `Player` VARCHAR(11)
);

INSERT INTO playerstats 
  (`Score`, `Player`)
VALUES
  ('2543', 'jkoffa'),
  ('2204', 'probins'),
  ('2010', 'rwatson'),
  ('2010', 'nbk'),
  ('2010', 'tthamos'),
  ('1950', 'en,acdonald'),
  ('1927', 'dmaginis');
SELECT
`Player`
,IF(@score <> `Score` , @rn := @rn + @cor +1, @rn:= @rn) rnknumber
,IF(@score = `Score` , IF(@cor > 0,@cor := @cor +1,@cor := 1), @cor := 0) correction
,@score := `Score` 'Score'
FROM
(SELECT `Score`, `Player` FROM playerstats ORDER BY Score DESC) t1
, (SELECT @score := -1) t2
,(SELECT @rn := 0) t3,(SELECT @cor := 0) t4
播放器 | 号码 | 修正 | 分数
:------------ | :-------- | ---------: | ----:
杰科法 | 1 | 0 | 2543
探针 | 2 | 0 | 2204
沃森| 3 | 0 | 2010
nbk | 3 | 1 | 2010
塔莫斯 | 3 | 2 | 2010
恩,阿克唐纳| 6 | 0 | 1950
dmaginis | 7 | 0 | 1927年

db<>在这里摆弄

对于Mariadb 10.3

CREATE TABLE playerstats  (
  `Score` INTEGER,
  `Player` VARCHAR(11)
);

INSERT INTO playerstats 
  (`Score`, `Player`)
VALUES
 ('2010', 'tthamos'),
  ('1950', 'acdonald'),
  ('1927', 'dmaginis'),
  ('2010', 'nbk'),
  ('2543', 'jkoffa'),
  ('2204', 'probins'),
  ('2010', 'rwatson');
SELECT
`Player`
,IF(@score <> `Score` , @rn := @rn + @cor +1, @rn:= @rn ) rnknumber
,IF(@score = `Score` , IF(@cor > 0,@cor := @cor +1,@cor := 1), @cor := 0) correction
,@score := `Score` 'Score'
FROM
(SELECT `Score`, `Player` FROM playerstats ORDER BY Score DESC LIMIT 18446744073709551615) t1
, (SELECT @score := -1) t2
,(SELECT @rn := 0) t3,(SELECT @cor := 0) t4
播放器 | 号码 | 修正 | 分数
:------- | :-------- | ---------: | ----:
杰科法 | 1 | 0 | 2543
探针 | 2 | 0 | 2204
塔莫斯 | 3 | 0 | 2010
nbk | 3 | 1 | 2010
沃森| 3 | 2 | 2010
阿克唐纳德| 6 | 0 | 1950
dmaginis | 7 | 0 | 1927年

db<>在这里摆弄

于 2020-06-04T15:51:35.660 回答
0

nbk - 我为图片道歉,下次确保使用文字。再次感谢您的宝贵时间。不幸的是,它仅在以正确的顺序输入数据时才有效。如果您要取最后三个条目并将它们放在第一位,那么 tthomos 将排名第一。

CREATE TABLE playerstats  (
  `Score` INTEGER,
  `Player` VARCHAR(11)
);

INSERT INTO playerstats 
  (`Score`, `Player`)
VALUES
  ('2010', 'tthamos'),
  ('1950', 'acdonald'),
  ('1927', 'dmaginis'),
  ('2543', 'jkoffa'),
  ('2204', 'probins'),
  ('2010', 'rwatson');

然后跑:

SELECT
`Player`
,IF(@score <> `Score` , @rn := @rn + @cor +1, @rn:= @rn) rnknumber
,IF(@score = `Score` , @cor := 1, @cor := 0) correction
,@score := `Score` 'Score'
FROM
(SELECT `Score`, `Player` FROM playerstats ORDER BY Score DESC) t1
, (SELECT @score := -1) t2
,(SELECT @rn := 0) t3,(SELECT @cor := 0) t4

你会得到:

tthamos   1     0   2010
acdonal   2     0   1950
dmaginis  3     0   1927
jkoffa    4     0   2543
probins   5     0   2204
rwatshon  6     0   2010
于 2020-06-04T21:10:01.190 回答