「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」
描述
题目:现在运营想要了解浙江大学的用户在不同难度题目下答题的正确率情况,请取出相应数据,并按照准确率升序输出。
示例: user_profile
示例: question_practice_detail
示例: question_detail
根据示例,你的查询应返回以下结果:
示例1
drop table if exists `user_profile`;
drop table if exists `question_practice_detail`;
drop table if exists `question_detail`;
CREATE TABLE `user_profile` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float,
`active_days_within_30` int ,
`question_cnt` int ,
`answer_cnt` int
);
CREATE TABLE `question_practice_detail` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`question_id`int NOT NULL,
`result` varchar(32) NOT NULL,
`date` date NOT NULL
);
CREATE TABLE `question_detail` (
`id` int NOT NULL,
`question_id`int NOT NULL,
`difficult_level` varchar(32) NOT NULL
);
INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
...
INSERT INTO question_practice_detail VALUES(14,3214,112,'wrong','2021-08-16');
INSERT INTO question_practice_detail VALUES(15,3214,113,'wrong','2021-08-18');
INSERT INTO question_practice_detail VALUES(16,6543,111,'right','2021-08-13');
...
INSERT INTO question_detail VALUES(4,115,'easy');
INSERT INTO question_detail VALUES(5,116,'medium');
INSERT INTO question_detail VALUES(6,117,'easy');
easy|0.5000
medium|1.0000
方法一
根据题目要求的是浙江大学的用户在不同难度下回答题目的一个准确率,最终返回的列是题目难度和对应的准确率,那么我们所需哪些表中列来构造出最终要返回的列呢?首先,题目难度在表在直接可以查询得到,另一个难度对应的准确率是通过该难度下答对的数量 / 该难度下所有题目的数量求得,其中该难度下答对的数量通过result字段可以统计出,该难度下所有题目的数量通过分组和count函数可以求得;又因为所用的这些字段并不都在同一张表中,因此我们需要将三张表连接起来(在内连接,外连接都可以的情况下,最好使用内连接,因为内连接有优化的空间),并且利用where将不是浙江大学的用户排除;sql语句如下:
select difficult_level, sum(if(result='right', 1, 0)) / count(difficult_level) as correct_rate
from (
select qpd.question_id, result, difficult_level
from user_profile up join question_practice_detail qpd join question_detail qd
on up.device_id=qpd.device_id and qpd.question_id=qd.question_id
where up.university='浙江大学'
) t
group by difficult_level
order by correct_rate