我对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);
在我的显示行中,我需要首先使用排名列,并且应该根据最高投票数显示排名。重要的是,相同数量的选票需要具有相同的等级。
我已多次尝试过但没能做到...... 请帮帮我
感谢
答案 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;
关于这个:
(@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