「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」
描述
题目: 现在运营想要了解2021年8月份所有练习过题目的总用户数和练习过题目的总次数,请取出相应结果
示例:question_practice_detail
根据的示例,你的查询应返回以下结果:
示例1
drop table if exists `user_profile`;
drop table if exists `question_practice_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
);
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 user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);
INSERT INTO question_practice_detail VALUES(1,2138,111,'wrong','2021-05-03');
INSERT INTO question_practice_detail VALUES(2,3214,112,'wrong','2021-05-09');
INSERT INTO question_practice_detail VALUES(3,3214,113,'wrong','2021-06-15');
...
3|12
方法一
根据题意,我们所要求的是2021年八月份的做题数和做题用户,那么只需要用count
函数来统计一下即可,对于限定条件2021年八月,用where
条件限定;sql语句如下:
SELECT COUNT(DISTINCT device_id) AS did_cnt, COUNT(question_id) AS question_cnt
FROM question_practice_detail
WHERE MONTH(date)=8 AND YEAR(date)=2021
其中对于where
中的限定,同样可以用like
来解决
WHERE date LIKE '2021-08%'
或者说同样可以用字符串截取的方法来限定
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(date, '-', 2), '-', -1)='08'
AND SUBSTRING_INDEX(date, '-', 1)='2021'
另外,在统计用户数量时,注意要加上distinct
关键字来去掉重复的用户;
十年磨一剑,连续一段时间的sql题刷下来,现在对sql有了更深的理解,加油!