力扣574(MySQL)-当选者(中等)

题目:

表: Candidate

  表: Vote

id 是自动递增的主键,CandidateId 是 Candidate 表中的 id.

问题:请编写 sql 语句来找到当选者的名字,上面的例子将返回当选者 B.

 注意: 你可以假设没有平局,换言之,最多只有一位当选者。

解题思路:

 ①先找出Vote表中出现次数最多的选手,将Vote中按CandidateId分组,并统计出现的id次数,降序排序,使用limit 1取出第一名;

1 SELECT CandidateId 
2 FROM vote_574 
3 GROUP BY CandidateId 
4 ORDER BY count( id ) DESC
5 LIMIT 1;

 ②筛选出Candidate表中与第①步查询出来的CandidateId相对应的Name。

1 SELECT name 
2 FROM candidate_574 a,
3     ( SELECT CandidateId 
4       FROM vote_574 
5       GROUP BY CandidateId 
6       ORDER BY count( id ) DESC
7       LIMIT 1 ) as b
8 WHERE
9     a.id = b.CandidateId;

或:

1 SELECT name 
2 FROM 
3     ( SELECT CandidateId 
4       FROM vote_574 
5       GROUP BY CandidateId 
6       ORDER BY count( id ) DESC
7       LIMIT 1 ) as a
8 JOIN candidate_574 b
9 ON a.CandidateId = b.id;

 补充建表语句:

 1 Create table If Not Exists Candidate_574 (id int, Name varchar(255));
 2 Create table If Not Exists Vote_574 (id int, CandidateId int);
 3 -- 删除表中所有行数据
 4 Truncate table Candidate_574;
 5 insert into Candidate_574 (id, Name) values ('1', 'A');
 6 insert into Candidate_574 (id, Name) values ('2', 'B');
 7 insert into Candidate_574 (id, Name) values ('3', 'C');
 8 insert into Candidate_574 (id, Name) values ('4', 'D');
 9 insert into Candidate_574 (id, Name) values ('5', 'E');
10 Truncate table Vote_574;
11 insert into Vote_574 (id, CandidateId) values ('1', '2');
12 insert into Vote_574 (id, CandidateId) values ('2', '4');
13 insert into Vote_574 (id, CandidateId) values ('3', '3');
14 insert into Vote_574 (id, CandidateId) values ('4', '2');
posted on 2023-03-27 09:42  我不想一直当菜鸟  阅读(48)  评论(0编辑  收藏  举报