SQL155. 大小写混乱时的筛选统计
描述
现有试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间):id | exam_id | tag | difficulty | duration | release_time |
1 | 9001 | 算法 | hard | 60 | 2021-01-01 10:00:00 |
2 | 9002 | C++ | hard | 80 | 2021-01-01 10:00:00 |
3 | 9003 | C++ | hard | 80 | 2021-01-01 10:00:00 |
4 | 9004 | sql | medium | 70 | 2021-01-01 10:00:00 |
5 | 9005 | C++ | hard | 80 | 2021-01-01 10:00:00 |
6 | 9006 | C++ | hard | 80 | 2021-01-01 10:00:00 |
7 | 9007 | C++ | hard | 80 | 2021-01-01 10:00:00 |
8 | 9008 | SQL | medium | 70 | 2021-01-01 10:00:00 |
9 | 9009 | SQL | medium | 70 | 2021-01-01 10:00:00 |
10 | 9010 | SQL | medium | 70 | 2021-01-01 10:00:00 |
id | uid | exam_id | start_time | submit_time | score |
1 | 1001 | 9001 | 2020-01-01 09:01:01 | 2020-01-01 09:21:59 | 80 |
2 | 1002 | 9003 | 2020-01-20 10:01:01 | 2020-01-20 10:10:01 | 81 |
3 | 1002 | 9002 | 2020-02-01 12:11:01 | 2020-02-01 12:31:01 | 83 |
4 | 1003 | 9002 | 2020-03-01 19:01:01 | 2020-03-01 19:30:01 | 75 |
5 | 1004 | 9002 | 2020-03-01 12:01:01 | 2020-03-01 12:11:01 | 60 |
6 | 1005 | 9002 | 2020-03-01 12:01:01 | 2020-03-01 12:41:01 | 90 |
7 | 1006 | 9001 | 2020-05-02 19:01:01 | 2020-05-02 19:32:00 | 20 |
8 | 1007 | 9003 | 2020-01-02 19:01:01 | 2020-01-02 19:40:01 | 89 |
9 | 1008 | 9004 | 2020-02-02 12:01:01 | 2020-02-02 12:20:01 | 99 |
10 | 1008 | 9001 | 2020-02-02 12:01:01 | 2020-02-02 12:31:01 | 98 |
11 | 1009 | 9002 | 2020-02-02 12:01:01 | 2020-01-02 12:43:01 | 81 |
12 | 1010 | 9001 | 2020-01-02 12:11:01 | (NULL) | (NULL) |
13 | 1010 | 9001 | 2020-02-02 12:01:01 | 2020-01-02 10:31:01 | 89 |
tag | answer_cnt |
C++ | 6 |
exam_id | tag | answer_cnt |
9001 | 算法 | 4 |
9002 | C++ | 6 |
9003 | c++ | 2 |
9004 | sql | 2 |
示例1
输入:
drop table if exists examination_info,exam_record; CREATE TABLE examination_info ( id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID', exam_id int UNIQUE NOT NULL COMMENT '试卷ID', tag varchar(32) COMMENT '类别标签', difficulty varchar(8) COMMENT '难度', duration int NOT NULL COMMENT '时长', release_time datetime COMMENT '发布时间' )CHARACTER SET utf8 COLLATE utf8_bin; CREATE TABLE exam_record ( id int PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID', uid int NOT NULL COMMENT '用户ID', exam_id int NOT NULL COMMENT '试卷ID', start_time datetime NOT NULL COMMENT '开始时间', submit_time datetime COMMENT '提交时间', score tinyint COMMENT '得分' )CHARACTER SET utf8 COLLATE utf8_general_ci; INSERT INTO examination_info(exam_id,tag,difficulty,duration,release_time) VALUES (9001, '算法', 'hard', 60, '2020-01-01 10:00:00'), (9002, 'C++', 'hard', 80, '2020-01-01 10:00:00'), (9003, 'c++', 'hard', 80, '2020-01-01 10:00:00'), (9004, 'sql', 'medium', 70, '2020-01-01 10:00:00'), (9005, 'C++', 'hard', 80, '2020-01-01 10:00:00'), (9006, 'C++', 'hard', 80, '2020-01-01 10:00:00'), (9007, 'C++', 'hard', 80, '2020-01-01 10:00:00'), (9008, 'SQL', 'medium', 70, '2020-01-01 10:00:00'), (9009, 'SQL', 'medium', 70, '2020-01-01 10:00:00'), (9010, 'SQL', 'medium', 70, '2020-01-01 10:00:00'); INSERT INTO exam_record(uid,exam_id,start_time,submit_time,score) VALUES (1001, 9001, '2020-01-01 09:01:01', '2020-01-01 09:21:59', 80), (1002, 9003, '2020-01-20 10:01:01', '2020-01-20 10:10:01', 81), (1002, 9002, '2020-01-01 12:11:01', '2020-01-01 12:31:01', 83), (1003, 9002, '2020-01-01 19:01:01', '2020-01-01 19:30:01', 75), (1004, 9002, '2020-01-01 12:01:01', '2020-01-01 12:11:01', 60), (1005, 9002, '2020-01-01 12:01:01', '2020-01-01 12:41:01', 90), (1006, 9001, '2020-01-02 19:01:01', '2020-01-02 19:32:00', 20), (1007, 9003, '2020-01-02 19:01:01', '2020-01-02 19:40:01', 89), (1008, 9004, '2020-01-02 12:01:01', '2020-01-02 12:20:01', 99), (1008, 9001, '2020-01-02 12:01:01', '2020-01-02 12:31:01', 98), (1009, 9002, '2020-01-02 12:01:01', '2020-01-02 12:43:01', 81), (1010, 9002, '2020-01-02 12:11:01', null, null), (1011, 9001, '2020-01-02 10:01:01', '2020-01-02 10:31:01', 89);
输出:
c++|6
Mysql 解法, 执行用时: 37ms, 内存消耗: 6380KB, 提交时间: 2022-01-23
/* #1. 所有tag 各自的 总答题数 select tag ,count(start_time) cnt from examination_info ei left join exam_record er on ei.exam_id=er.exam_id group by tag 算法|4 C++|6 c++|2 sql|1 SQL|0 */ /* #2. 查询 作答次数小于3的tag select tag from exam_record er join examination_info ei on er.exam_id=ei.exam_id group by ei.exam_id having count(start_time) <3 c++ sql */ #3.将表1和表2连接一起 通过大写的表2tag =表1 .tag select a.tag , cnt from ( select tag from exam_record er join examination_info ei on er.exam_id=ei.exam_id group by ei.exam_id having count(start_time) <3 ) a join ( select tag ,count(start_time) cnt from examination_info ei left join exam_record er on ei.exam_id=er.exam_id group by tag ) b on UPPER(a.tag)=b.tag where cnt <> 0 and a.tag <> upper(a.tag)
Mysql 解法, 执行用时: 37ms, 内存消耗: 6416KB, 提交时间: 2022-01-22
with t as ( select tag, count(er.start_time) as answer_cnt from examination_info ei right join exam_record er using (exam_id) group by tag ) select t.tag, t1.answer_cnt from t inner join t t1 on upper(t.tag) = t1.tag and t.tag != t1.tag where t.answer_cnt < 3
Mysql 解法, 执行用时: 37ms, 内存消耗: 6424KB, 提交时间: 2022-01-24
with a as ( select er.exam_id,tag,count(start_time) as answer_cnt from exam_record er join examination_info ei on er.exam_id=ei.exam_id group by tag ) select a.tag,b.answer_cnt from a join a as b on upper(a.tag)=b.tag and a.tag!=b.tag where a.answer_cnt<3
Mysql 解法, 执行用时: 37ms, 内存消耗: 6436KB, 提交时间: 2021-12-07
WITH t_tag_count as ( SELECT tag, COUNT(uid) as answer_cnt FROM exam_record LEFT JOIN examination_info USING(exam_id) GROUP BY tag ) SELECT a.tag, b.answer_cnt FROM t_tag_count as a JOIN t_tag_count as b ON UPPER(a.tag) = b.tag and a.tag != b.tag and a.answer_cnt < 3; ####
Mysql 解法, 执行用时: 37ms, 内存消耗: 6440KB, 提交时间: 2021-12-15
#筛选试卷作答次数小于3的类别tag #将这tag转换为大写 #对应原本的试卷作答次数 #转换后,tag没变化,不输出该结果 with t as ( select tag,count(start_time) as answer_cnt from exam_record er join examination_info ei on er.exam_id = ei.exam_id group by tag ) select t.tag,t2.answer_cnt from t inner join t as t2 on UPPER(t.tag) = t2.tag and t.tag <> t2.tag where t.answer_cnt < 3