力扣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 )
相关推荐
东方护航数据恢复(深圳)21 分钟前
MySQL_Oracle数据库崩溃修复全攻略_东方护航数据恢复深圳店
数据库·mysql·oracle
Hi李耶1 小时前
【LeetCode】15.三数之和
java·算法·leetcode
rannn_1112 小时前
【力扣hot100】链表专题|21、2、19、24、92、25
java·数据结构·算法·leetcode·链表·开发
鹿角片ljp2 小时前
LeetCode 21. 合并两个有序链表
算法·leetcode·链表
Rabitebla3 小时前
C++11 新特性详解(一):列表初始化、initializer_list 与右值引用
java·开发语言·数据结构·c++·算法·leetcode·list
evans在进步4 小时前
LeetCode 39:组合总和——Java DFS 回溯与剪枝详解
java·leetcode·深度优先
梓沂4 小时前
CentOS 7.9 静默安装 Oracle 11gR2 企业版全记录
linux·oracle·centos
XWalnut4 小时前
LeetCode刷题 day37
java·数据结构·算法·leetcode
ShuiShenHuoLe5 小时前
HmarkX(码笺)的本地数据库模块重构实战
数据库·oracle·重构
sugar__salt5 小时前
MyBatis-Plus 从入门到实战:高效简化数据库开发的完整指南
数据库·spring boot·mybatis·数据库开发