574 当选者
SQL架构
Create table If Not Exists Candidate_574 (id int, Name varchar(255));
Create table If Not Exists Vote_574 (id int, CandidateId int);
Truncate table Candidate_574;
insert into Candidate_574 (id, Name) values ('1', 'A');
insert into Candidate_574 (id, Name) values ('2', 'B');
insert into Candidate_574 (id, Name) values ('3', 'C');
insert into Candidate_574 (id, Name) values ('4', 'D');
insert into Candidate_574 (id, Name) values ('5', 'E');
Truncate table Vote_574;
insert into Vote_574 (id, CandidateId) values ('1', '2');
insert into Vote_574 (id, CandidateId) values ('2', '4');
insert into Vote_574 (id, CandidateId) values ('3', '3');
insert into Vote_574 (id, CandidateId) values ('4', '2');
insert into Vote_574 (id, CandidateId) values ('5', '5');
表: Candidate
+-----+---------+
| id | Name |
+-----+---------+
| 1 | A |
| 2 | B |
| 3 | C |
| 4 | D |
| 5 | E |
+-----+---------+
表: Vote
+-----+--------------+
| id | CandidateId |
+-----+--------------+
| 1 | 2 |
| 2 | 4 |
| 3 | 3 |
| 4 | 2 |
| 5 | 5 |
+-----+--------------+
id 是自动递增的主键,
CandidateId 是 Candidate 表中的 id.
请编写 sql 语句来找到当选者的名字,上面的例子将返回当选者 B.
+------+
| Name |
+------+
| B |
+------+
解题
获胜者是 Vote 表中出现最多次的 CandidateId。
因此可以先按照 CandidateId 分组,然后按照每个分组的计数给分组排序,使用 limit 1 取第一名即可。
获得第一名的 CandidateId 之后,与 Candidate 表连接即可取得获胜者的名字。
select `Name`
from (
select CandidateId as id
from Vote_574
group by CandidateId
order by count(id) desc
limit 1
) as Winner join Candidate_574
on Winner.id = Candidate_574.id;