力扣574-当选者

表: 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 )
相关推荐
程序员-King.1 小时前
day110—同向双指针(数组)—最多K个重复元素的最长子数组(LeetCode-2958)
算法·leetcode·双指针
做怪小疯子1 小时前
LeetCode 热题 100——二叉树——二叉树的右视图
算法·leetcode·职场和发展
Swift社区1 小时前
LeetCode 442 - 数组中重复的数据
算法·leetcode·职场和发展
努力学算法的蒟蒻1 小时前
day25(12.5)——leetcode面试经典150
算法·leetcode·职场和发展
他们叫我技术总监2 小时前
ORA-14402: 更新分区关键字列将导致分区的更改,多种解决方案
oracle·ora-14402
步步为营DotNet2 小时前
深度解析DbContext ChangeTracker:实体状态管理与性能优化
数据库·oracle·性能优化
a3722107742 小时前
HikariCP配置 高并发下连接泄漏避免
java·数据库·oracle
Non-existent9872 小时前
Flutter + FastAPI 30天速成计划自用并实践-第7天
flutter·oracle·fastapi
程序员-King.3 小时前
day107—同向双指针—无重复字符的最长字串(LeetCode-3)
算法·leetcode·双指针