本文摘自PHP中文网,作者藏色散人,侵删。
??嗦(可跳过)前几天面试,笔试时遇到这道题,读了几遍题目都是懵懵懂懂,“一个段时间内至少N天,这N天中每天的分数总和要大于M”,好绕,最后没有写对。
今天想起来这道题,写出了答案并进行了sql语句的验证。
推荐:《mysql视频教程》,《mysql面试题2020》
问题
某游戏使用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语句上。
由“从内到外”的原则,我们先对每天的得分进行聚合,那就是对天进行聚合。
1 2 3 4 5 6 7 8 9 10 |
|
答案
1 2 3 |
|
验证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
以上就是关于一道mysql查询面试题的思考解决过程的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
navicat for mysql定时备份数据库及数据恢复操作
关于linux如何实现mysql数据库每天自动备份与定时备份的示例详解
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。