题目描述
我们有两个表:
submission
:包含代码提交信息,包括提交IDid
、题单IDsubject_id
和提交日期create_time
。subject
:包含题单信息,包括题单IDid
和题单名称name
。
目标是查询出当天每个题单的刷题量,并按提交数量降序排序,如果提交数量相同,则按题单ID升序排序。
知识点
- 连接操作:使用
JOIN
连接提交表和题单表。 - 聚合函数:使用
COUNT
函数计算每个题单的提交数量。 - 日期函数:使用
CURDATE()
函数获取当天日期。 - 分组和排序:使用
GROUP BY
和ORDER BY
子句进行分组和排序。
关键问题分析
1. 连接提交表和题单表
我们使用JOIN
连接提交表和题单表,以获取题单名称:
join subject sj on sm.subject_id = sj.id
JOIN subject sj ON sm.subject_id = sj.id
: 连接题单信息。
2. 筛选当天的提交记录
我们使用CURDATE()
函数筛选出当天的提交记录:
where sm.create_time = curdate()
WHERE sm.create_time = CURDATE()
: 筛选出当天的提交记录。
3. 计算每个题单的提交数量
我们使用COUNT
函数计算每个题单的提交数量,并使用GROUP BY
子句按题单分组:
select sj.name, count(*) as cnt
...
group by sj.name, sj.id
COUNT(*) AS cnt
: 计算每个题单的提交数量。GROUP BY sj.name, sj.id
: 按题单分组计算提交数量。
4. 排序输出
我们按提交数量降序排序,如果提交数量相同,则按题单ID升序排序:
order by cnt desc, sj.id asc
ORDER BY cnt DESC, sj.id ASC
: 按提交数量降序排序,如果提交数量相同,则按题单ID升序排序。
完整代码
select sj.name, count(*) as cnt
from submission sm
join subject sj on sm.subject_id = sj.id
where sm.create_time = curdate()
group by sj.name, sj.id
order by cnt desc, sj.id asc;