表: Candidate
+-------------+----------+ | Column Name | Type | +-------------+----------+ | id | int | | name | varchar | +-------------+----------+ id 是该表中具有唯一值的列 该表的每一行都包含关于候选对象的id和名称的信息。
表: Vote
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | candidateId | int | +-------------+------+ id 是自动递增的主键(具有唯一值的列)。 candidateId是id来自Candidate表的外键(reference 列)。 该表的每一行决定了在选举中获得第i张选票的候选人。
编写解决方案来报告获胜候选人的名字(即获得最多选票的候选人)。
生成的测试用例保证 只有一个候选人赢得 选举。
返回结果格式如下所示。
示例 1:
输入: Candidate table: +----+------+ | id | name | +----+------+ | 1 | A | | 2 | B | | 3 | C | | 4 | D | | 5 | E | +----+------+ Vote table: +----+-------------+ | id | candidateId | +----+-------------+ | 1 | 2 | | 2 | 4 | | 3 | 3 | | 4 | 2 | | 5 | 5 | +----+-------------+ 输出: +------+ | name | +------+ | B | +------+ 解释: 候选人B有2票。候选人C、D、E各有1票。 获胜者是候选人B。
思路:
1、首先两个表关联
2、需要对candidateId进行count()统计个数,对candidateId 分组
本题有多个解法方式
代码1:(row_number)
SELECT name
FROM (
SELECT t1.name,
ROW_NUMBER() OVER (ORDER BY COUNT(t2.candidateId) DESC) AS rn
FROM Candidate t1
JOIN Vote t2 ON t1.id = t2.candidateId
GROUP BY t1.id, t1.name
)
WHERE rn = 1;
代码2:(子查询和join连接,支持平票)
SELECT t1.name
FROM Candidate t1
JOIN (
SELECT t2.candidateId, COUNT(*) AS vote_count
FROM Vote t2
GROUP BY t2.candidateId
) t3 ON t1.id = t3.candidateId
WHERE t3.vote_count = (
SELECT MAX(t4.cnt)
FROM (
SELECT COUNT(*) AS cnt
FROM Vote t4
GROUP BY candidateId
) t4
);
代码3:(MySQL/PostgreSql join+order imit);
SELECT t1.name
FROM Candidate t1
JOIN Vote t2 ON t1.id = t2.candidateId
GROUP BY t1.id, t1.name
ORDER BY COUNT(*) DESC
LIMIT 1;
代码4:(笛卡尔积)
select name
from Candidate a,Vote b
where a.id=b.candidateId
group by name
having count(1)>=all(select count(1) from Vote group by candidateId )
力扣574:当选者查询解析
218

被折叠的 条评论
为什么被折叠?



