574. 当选者

it2024-05-12  49

表: Candidate

表: Vote

请编写 sql 语句来找到当选者的名字,上面的例子将返回当选者 B.

注意:

你可以假设没有平局,换言之,最多只有一位当选者。

题目条件

# MySQL DROP TABLE IF EXISTS `candidate`; CREATE TABLE `candidate` ( `id` int(11) DEFAULT NULL, `Name` varchar(20) COLLATE utf8_bin DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; insert into `candidate`(`id`,`Name`) values (1,'A'),(2,'B'),(3,'C'),(4,'D'),(5,'E'); DROP TABLE IF EXISTS `vote`; CREATE TABLE `vote` ( `id` int(11) DEFAULT NULL, `CandidateId` int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; insert into `vote`(`id`,`CandidateId`) values (1,2),(2,4),(3,3),(4,2),(5,5);

方法一:使用临时表进行连接

算法

获胜者是 Vote 表中出现最多次的 CandidateId。因此可以先按照 CandidateId 分组,然后按照每个分组的计数给分组排序,使用 limit 1 取第一名即可。获得第一名的 CandidateId 之后,与 Candidate 表连接即可取得获胜者的名字。

# MySQL SELECT NAME FROM ( SELECT CandidateId AS id FROM Vote GROUP BY CandidateId ORDER BY COUNT(id) DESC LIMIT 1 ) AS Winner JOIN Candidate ON Winner.id = Candidate.id;

结果

方法二:使用临时表和子查询

算法

第一步: 统计Vote表的投票情况,作一临时表a。

# MySQL SELECT a.`CandidateId`,vote_num FROM (SELECT `CandidateId`,COUNT(`CandidateId`) AS vote_num FROM `vote` GROUP BY `CandidateId`) AS a;

结果

第二步: 根据上一步临时表a的投票情况,找出最高投票数vote_num,作一临时表b。

# MySQL SELECT MAX(vote_num) AS vote_num FROM (SELECT `CandidateId`,COUNT(`CandidateId`) AS vote_num FROM `vote` GROUP BY `CandidateId`) AS b;

结果

第三步: 根据临时表b,找出唯一最高投票数的CandidateId并命名为id。

# MySQL SELECT a.`CandidateId` AS id FROM (SELECT `CandidateId`,COUNT(`CandidateId`) AS vote_num FROM `vote` GROUP BY `CandidateId`) AS a WHERE a.vote_num IN (SELECT MAX(vote_num) AS vote_num FROM (SELECT `CandidateId`,COUNT(`CandidateId`) AS vote_num FROM `vote` GROUP BY `CandidateId`) AS b) LIMIT 1;

结果

第四步: 根据唯一最高投票数的id和candidate表连接,查出唯一最高投票数的相关信息。

# MySQL SELECT `Name` FROM `candidate` WHERE `id` IN (SELECT a.`CandidateId` AS id FROM (SELECT `CandidateId`,COUNT(`CandidateId`) AS vote_num FROM `vote` GROUP BY `CandidateId`) AS a WHERE a.vote_num IN (SELECT MAX(vote_num) AS vote_num FROM (SELECT `CandidateId`,COUNT(`CandidateId`) AS vote_num FROM `vote` GROUP BY `CandidateId`) AS b)) LIMIT 1;

结果

来源:力扣(LeetCode)

上一题:511/512/534/550. 游戏玩法分析 I/Ⅱ/Ⅲ/Ⅳ

最新回复(0)