题目描述

我们有两个表:

  • submission:包含代码提交信息,包括提交ID id、题单ID subject_id 和提交日期 create_time
  • subject:包含题单信息,包括题单ID id 和题单名称 name

目标是查询出当天每个题单的刷题量,并按提交数量降序排序,如果提交数量相同,则按题单ID升序排序。

知识点

  • 连接操作:使用JOIN连接提交表和题单表。
  • 聚合函数:使用COUNT函数计算每个题单的提交数量。
  • 日期函数:使用CURDATE()函数获取当天日期。
  • 分组和排序:使用GROUP BYORDER 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;