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
我有一个 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