力扣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 )
相关推荐
岁岁种桃花儿13 小时前
MySQL 8.0 基本数据类型全面解析
数据库·mysql·数据库开发
有一个好名字13 小时前
力扣-确定两个字符串是否接近
算法·leetcode·职场和发展
独自破碎E14 小时前
【层序遍历】序列化二叉树
leetcode
菜鸟233号15 小时前
力扣518 零钱兑换II java实现
java·数据结构·算法·leetcode·动态规划
VT.馒头16 小时前
【力扣】2622. 有时间限制的缓存
javascript·算法·leetcode·缓存·typescript
程序修理员16 小时前
oracle备份表还原
数据库·oracle
独自破碎E17 小时前
【新视角】输出二叉树的右视图
leetcode
Ka1Yan17 小时前
[链表] - 代码随想录 160. 相交链表
算法·leetcode·链表
小欣加油17 小时前
leetcode 174 地下城游戏
c++·算法·leetcode·职场和发展·动态规划
有一个好名字19 小时前
力扣-奇偶链表
算法·leetcode·链表