mysql 计数的排名和减法

mysql rank and subtraction of count

我有一个 table 来存储选票。我查询了候选人的排名,我还想让候选人看看需要多少票才能与排名在其上方的候选人所持有的票数相等。

 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  num    rank
1            42     1
6            16     2
8            9      3
2            3      4
7            1      5
4            1      6

我想得到

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=6 需要 26 票才能与排名高于他们的候选人持平。 candidateid=2只需6票即可达到9票,与candidateid=8拉平。

只需使用附加变量扩展您的查询即可计算差异:

  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