表: 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)
sql
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连接,支持平票)
sql
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);
sql
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:(笛卡尔积)
sql
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 )