力扣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 )
相关推荐
琢磨先生David3 天前
Day1:基础入门·两数之和(LeetCode 1)
数据结构·算法·leetcode
jnrjian4 天前
ORA-01017 查找机器名 用户名 以及library cache lock 参数含义
数据库·oracle
超级大福宝4 天前
N皇后问题:经典回溯算法的一些分析
数据结构·c++·算法·leetcode
Charlie_lll4 天前
力扣解题-88. 合并两个有序数组
后端·算法·leetcode
菜鸡儿齐4 天前
leetcode-最小栈
java·算法·leetcode
TTc_4 天前
oracle中的union和union all有什么区别?
数据库·oracle
Frostnova丶4 天前
LeetCode 1356. 根据数字二进制下1的数目排序
数据结构·算法·leetcode
山峰哥4 天前
吃透 SQL 优化:告别慢查询,解锁数据库高性能
服务器·数据库·sql·oracle·性能优化·编辑器
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
样例过了就是过了4 天前
LeetCode热题100 环形链表 II
数据结构·算法·leetcode·链表