2016-04-09 9 views
1

私は投票を格納するテーブルを持っています。私は候補者のランクを照会し、その上にランクされた候補者の投票にどれだけの票が必要であるかを見てほしい。mysqlのランクと減算のカウント

私の知る限り、私は

candidateid num sub rank 
1   42 0 1 
6   16 26 2 
8   9 7 3 
2   3 6 4 
7   1 2 5 
4   1 0 6 

例えばを取得したい

candidateid num rank 
1   42  1 
6   16  2 
8   9  3 
2   3  4 
7   1  5 
4   1  6 

を得たとして

CREATE TABLE `vote` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`candidateid` int(11) NOT NULL, 
`openid` varchar(2048) NOT NULL, 
`weight` int(11) DEFAULT '1', 
`time` bigint(20) DEFAULT NULL, 
`date` varchar(56) DEFAULT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=utf8; 



     select t.* , @curRank := @curRank + 1 AS rank 
     from 
     (
     SELECT candidateid, 
       count(*) as num 
     FROM  vote p 
     group by candidateid 
     ORDER BY num desc 
     ) t, (SELECT @curRank := 0) r 

candidateid=6は、それらの上にランクされた候補者と同等に26票を必要とします。 candidateid=2は9に達するには6票しか必要ではなく、図面レベルはcandidateid=8でなければなりません。

答えて

1

だけの差を計算するために追加の変数を使用してクエリを拡張:

select t.candidateid , @curRank := @curRank + 1 AS rank, if(@prevote=-1, 0,@prevote-t.num) as sub, @prevote:=t.num as num 
    from 
    (
    SELECT candidateid, 
      count(*) as num 
    FROM  vote p 
    group by candidateid 
    ORDER BY num desc 
    ) t, (SELECT @curRank := 0, @prevote:=-1) r