请求编写SQL查询语句:按候选人与职位统计投票数并关联信息
SQL查询解决方案
需求说明
现有三张数据库表(VOTES、POSITIONS、CANDIDATES),需编写SQL语句,生成包含total_votes(总票数)、candidate_id(候选人ID)、candidate_name(候选人姓名)、position_id(职位ID)、position_name(职位名称)的结果集。
表结构与数据
VOTES表(投票记录表)
| id | voters_id | candidate_id | positions_id |
|---|---|---|---|
| 1 | xxx | 18 | 6 |
| 2 | xxx | 18 | 6 |
| 3 | xxx | 18 | 6 |
| 4 | xxx | 18 | 6 |
| 5 | xxx | 19 | 6 |
| 6 | xxx | 19 | 6 |
| 7 | xxx | 22 | 20 |
| 8 | xxx | 22 | 20 |
POSITIONS表(职位表)
| id | title |
|---|---|
| 6 | president |
| 20 | mayor |
CANDIDATES表(候选人表)
| id | name |
|---|---|
| 18 | mark |
| 19 | john |
| 22 | eddie |
期望输出
| total_votes | candidate_id | candidate_name | position_id | position_name |
|---|---|---|---|---|
| 4 | 18 | mark | 6 | president |
| 2 | 19 | john | 6 | president |
| 2 | 22 | eddie | 20 | mayor |
(注:原期望输出中第二行候选人姓名有误,已修正为john)
SQL查询语句
SELECT COUNT(v.id) AS total_votes, v.candidate_id, c.name AS candidate_name, v.positions_id AS position_id, p.title AS position_name FROM VOTES v JOIN CANDIDATES c ON v.candidate_id = c.id JOIN POSITIONS p ON v.positions_id = p.id GROUP BY v.candidate_id, v.positions_id, c.name, p.title ORDER BY position_id, total_votes DESC;
语句说明
- 分组统计:通过
GROUP BY按候选人ID和职位ID分组,用COUNT(v.id)统计每组投票数,得到总票数total_votes。 - 表关联:使用
JOIN关联候选人表和职位表,分别获取候选人姓名与职位名称。 - 字段别名:将查询字段重命名为需求指定的名称,与期望输出字段对应。
- 排序:添加
ORDER BY按职位ID、总票数降序排列,让结果逻辑更清晰。
内容的提问来源于stack exchange,提问作者user19593694
相关产品推荐
相关产品推荐

