分享mysql查询面试题的思考解决过程
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,今天小编给大家分享的是分享mysql查询面试题的思考解决过程前几天面试,笔试时遇到这道题,读了几遍题目都是懵懵懂懂,"一个段时间内至少N天,这N天中每天的分数总和要大于M",好绕,最后没有写对。今天想
千家信息网最后更新 2026年10月31日分享mysql查询面试题的思考解决过程
今天小编给大家分享的是分享mysql查询面试题的思考解决过程前几天面试,笔试时遇到这道题,读了几遍题目都是懵懵懂懂,"一个段时间内至少N天,这N天中每天的分数总和要大于M",好绕,最后没有写对。今天想起来这道题,写出了答案并进行了sql语句的验证。一起来看看吧。
问题
某游戏使用mysql数据库,数据表 scores 记录用户得分历史,uid 代表用户ID, score 表示分数, date 表示日期,每个用户每天都会产生多条记录。
数据结构以及数据行如下:
现在需要一份用户列表,这些用户在2017年3月份的31天中,至少要有16天,每天得分总和大于40分。使用一条sql语句表示。
思路
重新梳理需求,画出重点。
现在需要一份用户列表,这些用户在2017年3月份的31天中,至少要有16天,每天得分总和大于40分。使用一条sql语句表示。
用户列表
代表一个不重复的 uid 列表,可使用 DISTINCT uid 或 GROUP BY uid 来实现。
在2017年3月份的31天中
使用 where 语句限定时间范围。
至少要有16天
需要对天 date 进行聚合,使用聚合函数 COUNT(*) > 15来进行判断。
(每人)每天得分总和大于40
需要对每天分数 score 分数进行聚合,使用聚合函数对 SUM(score) > 40来进行判断。
此处有2处聚合函数,但是是针对不同维度的(天和每天里的分数),所以需要使用子查询,将2处聚合分别放置在内外层的sql语句上。
由"从内到外"的原则,我们先对每天的得分进行聚合,那就是对天进行聚合。
-- 在2017年3月份的31天中select * from scores where `date` >= '2017-03-01' and `date` <= '2017-03-31';-- (每人)每天得分总和大于40-- 使用 group by uid,date 实现对分数进行聚合,使用 having sum() 过滤结果select uid,date from scores where `date` >= '2017-03-01' and `date` <= '2017-03-31' group by uid, `date` having sum(score) > 40;-- 至少要有16天-- 以上条结果为基础,在对 group by uid 实现对天进行聚合,使用 having count() 过滤结果select uid from ( select uid,date from scores where `date` >= '2017-03-01' and `date` <= '2017-03-31' group by uid, `date` having sum(score) > 40) group by uid having count(*) > 15;
答案
SELECT uid FROM ( SELECT uid,date FROM WHERE `date` >= '2017-03-01' AND `date` <= '2017-03-31' GROUP BY uid,`date` HAVING SUM(score) > 40) WHERE GROUP BY uid HAVING count(*) > 15;
验证
-- 结构CREATE TABLE `scores` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) DEFAULT NULL, `score` int(11) DEFAULT NULL, `date` date DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 数据INSERT INTO `scores` VALUES ('1', '1', '1', '2018-04-03');INSERT INTO `scores` VALUES ('2', '1', '2', '2018-04-03');INSERT INTO `scores` VALUES ('3', '1', '1', '2018-04-04');INSERT INTO `scores` VALUES ('11', '1', '4', '2018-04-04');INSERT INTO `scores` VALUES ('12', '1', '3', '2018-04-06');INSERT INTO `scores` VALUES ('4', '1', '3', '2018-04-07');INSERT INTO `scores` VALUES ('5', '2', '2', '2018-04-04');INSERT INTO `scores` VALUES ('6', '2', '4', '2018-04-04');INSERT INTO `scores` VALUES ('7', '2', '1', '2018-04-03');INSERT INTO `scores` VALUES ('8', '3', '3', '2018-04-06');INSERT INTO `scores` VALUES ('9', '3', '1', '2018-04-05');INSERT INTO `scores` VALUES ('10', '3', '2', '2018-04-04');-- 因为数据录入量有限,我们将结果改为修改改为:-- 获取一个用户列表,时间范围是4号到6号,至少要有2天,每天分数总和大于2。-- 查询-- 非最精简语句,包含调试语句,可分段运行查看各个语句部分的效果。SELECT uidFROM ( SELECT uid, `date`, sum(score) AS total_score FROM scores WHERE `date` > '2018-04-03' AND `date` < '2018-04-07' GROUP BY uid, `date` HAVING total_score > 2 ORDER BY uid, date ) AS aGROUP BY uidHAVING count(*) > 1;-- 答案是:uid : 1以上就是分享mysql查询面试题的思考解决过程的简略介绍,当然详细使用上面的不同还得要大家自己使用过才领会。如果想了解更多,欢迎关注行业资讯频道哦!
用户
语句
分数
数据
得分
总和
查询
月份
函数
时间
答案
结果
过程
不同
代表
就是
结构
范围
验证
懵懵
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中关村互联网 科技集团
互联网科技公司华为
科技服务与互联网
猪兼强互联网科技
互联网科技小贷
期待互联网科技
为想互联网科技
上海喔噻互联网科技
奇士达互联网科技
互联网科技英文翻译
互联网科技公司做什么
美国互联网前沿科技
互联网科技教育视频
上海京穆互联网科技有限公司
每天都有哪些好的互联网科技
济南小医互联网科技有限公司招聘
承德科技产业互联网平台
重庆科技产业互联网有哪些
现代科技的标志之一的互联网
前海云享互联网科技
广州万易互联网科技有限公司
华服互联网科技怎么样
互联网科技工作委员会主任
互联网科技英文
大白互联网科技
互联网科技博主是什么意思
开一家科技互联网公司需要多少钱
徐州市互联网科技有限公司
吉林省码上互联网科技电话
互联网高科技绘画