表: Candidate
表: Vote
请编写 sql 语句来找到当选者的名字,上面的例子将返回当选者 B.
注意:
你可以假设没有平局,换言之,最多只有一位当选者。
获胜者是 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/Ⅱ/Ⅲ/Ⅳ