2016-04-09 2 views
1

У меня есть таблица для хранения голосов. Я запрашиваю ранг кандидатов, и я также хочу, чтобы кандидат увидел, сколько голосов требуется для равенства голосов, принадлежащих кандидату, занятому непосредственно над ними.mysql ранг и вычитание счета

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.

ответ

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