具有相同排名的排名顺序重复到相同级别排名类别

时间:2017-02-08 18:14:44

标签: mysql sql

我对sql不熟悉,我需要根据分配给每个人的投票对我的投票表进行排名,并且对于类似的投票,排名应该相同。

我的表就像

CREATE TABLE votes ( name varchar(10), votes INT );
INSERT INTO votes VALUES
('Ann',100), ('Jones',151), ('Smith',100), ('Rose',240), ('Lee',500), ('Adhams',500);

在我的显示行​​中,我需要首先使用排名列,并且应该根据最高投票数显示排名。重要的是,相同数量的选票需要具有相同的等级。

我已多次尝试过但没能做到...... 请帮帮我

感谢

3 个答案:

答案 0 :(得分:3)

您可以尝试以下代码。如果您仔细搜索过,可以通过许多链接轻松找到答案。

SET @rank=0;
SET @votes=0;
select x.rank as rank, x.name as name, x.votes as votes 
from(
  select @rank:=if(@votes=votes,@rank, @rank +1)AS rank,
      @votes := votes,
      v.name, 
      v.votes 
    from votes v 
      order by v.votes desc) as x;

答案 1 :(得分:2)

要生成RANK,首先需要按减少投票顺序(变量@rn)的行号,然后根据之前的投票值创建排名(变量@rank )。

试试这个:

SELECT v.*,
    @rank := if((@rn := @rn + 1) is not null,
                if (@votes = votes,
                    @rank,
                    if ((@votes := votes) is not null, @rn, 1)
                    ),1
                ) rank
FROM votes v
CROSS JOIN (
    SELECT 
        @votes := NULL, 
        @rank := 0, 
        @rn := 0
    ) t
ORDER BY v.votes DESC;

Demo

关于这个:

(@rn := @rn + 1) is not null

因为,表达式@rn := @rn + 1不能为空,我们通过不重复整个逻辑两次来利用它。

答案 2 :(得分:1)

您可以使用变量:

SELECT @rnk := IF(@v = votes, @rnk,
                  IF(@v := votes, @rnk + 1, @rnk + 1) AS rnk
       name, votes
FROM mytable
CROSS JOIN (SELECT @rnk := 0, @v = :0) AS vars
ORDER BY votes DESC