2016-04-09 9 views
1

Ich habe eine Tabelle, um die Stimmen zu speichern. Ich frage den Rang der Kandidaten ab, und ich möchte auch, dass der Kandidat sieht, wie viele Stimmen erforderlich sind, um den Stimmen des Kandidaten zu entsprechen, der unmittelbar über ihnen steht.Mysql Rang und Subtraktion der Zählung

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 

Soweit ich

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

I

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 

erhalten möchten z.B. candidateid=6 erfordert 26 Stimmen, um den Kandidaten über ihnen gleichrangig zu sein. candidateid=2 benötigt nur 6 Stimmen, um 9 zu erreichen, Zeichenebene mit candidateid=8.

Antwort

1

Sie Ihre Abfrage mit einer zusätzlichen Variablen erweitern den Unterschied zu berechnen:

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