LeetCode--574. 当选者

文章目录

  • [1 题目描述](#1 题目描述)
  • [2 测试用例](#2 测试用例)
  • [3 解题思路](#3 解题思路)
    • [3.1 解法 1](#3.1 解法 1)
    • [3.2 解法 2](#3.2 解法 2)

1 题目描述

表: Candidate

复制代码
+-------------+----------+  
| Column Name | Type     |  
+-------------+----------+  
| id          | int      |  
| name        | varchar  |  
+-------------+----------+  

id 是该表中具有唯一值的列

该表的每一行都包含关于候选对象的 id 和名称的信息.

表: Vote

复制代码
+-------------+------+  
| Column Name | Type |  
+-------------+------+  
| id          | int  |  
| candidateId | int  |  
+-------------+------+  

id 是自动递增的主键 (具有唯一值的列).

candidateId 是 id 来自 Candidate 表的外键 (reference 列).

该表的每一行决定了在选举中获得第 i 张选票的候选人.

编写解决方案来报告获胜候选人的名字 (即获得最多选票的候选人).

生成的测试用例保证 只有一个候选人赢得 选举

2 测试用例

输入:

Candidate table:

sql 复制代码
+----+------+  
| id | name |  
+----+------+  
| 1  | A    |  
| 2  | B    |  
| 3  | C    |  
| 4  | D    |  
| 5  | E    |  
+----+------+  

Vote table:

sql 复制代码
+----+-------------+  
| id | candidateId |  
+----+-------------+  
| 1  | 2           |  
| 2  | 4           |  
| 3  | 3           |  
| 4  | 2           |  
| 5  | 5           |  
+----+-------------+  

输出:

sql 复制代码
+------+  
| name |  
+------+  
| B    |  
+------+  

解释:

候选人 B 有 2 票. 候选人 C, D, E 各有 1 票

获胜者是候选人 B

3 解题思路

3.1 解法 1

  1. 使用 group by candidateIdcandidateId 分组统计被投票总数, 并按被投票次数, 倒序排序
sql 复制代码
select candidateId, count(candidateId) as cnt  
from Vote  
group by candidateId  
order by cnt desc  

查询结果

candidateId cnt
2 2
3 1
4 1
5 1
  1. 使用 limit 1 查找出票数最高的
sql 复制代码
select candidateId, count(candidateId) as cnt  
from Vote  
group by candidateId  
order by cnt desc  
limit 1  

查询结果

candidateId cnt
2 2
  1. 通过票数最高的 candidateIdCandidate 中查询 name
sql 复制代码
select c.name  
from Candidate as c  
         inner join (select candidateId, count(candidateId) as cnt  
                     from Vote  
                     group by candidateId  
                     order by cnt desc  
                     limit 1) as v on c.id = v.candidateId;  

查询结果

name
B

上面的 sql 在最终结果没有使用 count(candidateId) as cnt, 可以不需要这个, 简化 sql 复杂度

sql 复制代码
select name  
from Candidate  
where id = (select candidateId  
            from Vote  
            group by candidateId  
            order by count(candidateId) desc  
            limit 1);  

可以在 order by count(candidateId) desc 中直接使用统计函数 count

3.2 解法 2

  1. 使用 count(candidateId) over(partition by candidateId) as counts 分组统计 candidateId 的投票数量, 需要使用 distinct candidateId 对结果去重
sql 复制代码
select distinct candidateId,  
       count(candidateId) over (partition by candidateId) as counts  
from Vote  

查询结果

candidateId counts
2 2
3 1
4 1
5 1
  1. 对投票数量进行倒序排序, 使用 limit 1 查找出票数最高的
sql 复制代码
select distinct candidateId,  
       count(candidateId) over (partition by candidateId) as counts  
from Vote  
order by counts desc  
limit 1  

查询结果

candidateId counts
2 2
  1. 通过票数最高的 candidateIdCandidate 中查询 name, 可以参照解法 1 中简化 sql, 将 count(candidateId) over (partition by candidateId) 放在 order by
sql 复制代码
select name  
from Candidate  
where id = (select distinct candidateId  
            from Vote  
            order by count(candidateId) over (partition by candidateId) desc  
            limit 1);  

查询结果

name
B
相关推荐
陈卓41015 分钟前
MySQL-主从复制&分库分表
android·mysql·adb
你都会上树?1 小时前
MySQL MVCC 详解
数据库·mysql
长征coder2 小时前
AWS MySQL 读写分离配置指南
mysql·云计算·aws
ladymorgana2 小时前
【docker】修改 MySQL 密码后 Navicat 仍能用原密码连接
mysql·adb·docker
PanZonghui2 小时前
Centos项目部署之安装数据库MySQL8
linux·后端·mysql
GreatSQL社区3 小时前
用systemd管理GreatSQL服务详解
数据库·mysql·greatsql
掘根3 小时前
【MySQL进阶】错误日志,二进制日志,mysql系统库
数据库·mysql
weixin_438335403 小时前
基础知识:mysql-connector-j依赖
数据库·mysql
小明铭同学3 小时前
MySQL 八股文【持续更新ing】
数据库·mysql
许愿与你永世安宁4 小时前
力扣343 整数拆分
数据结构·算法·leetcode