力扣574-当选者

力扣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)

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连接,支持平票)

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);

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:(笛卡尔积)

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 )

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值