当前位置:首页 > MySQL教程 > 正文内容

关于一道mysql查询面试题的思考解决过程_MySQL教程,mysql

搜教程4年前 (2020-04-08)MySQL教程210

如何使用MySQL Sandbox快速部署mysql_MySQL教程

MySQL Sandbox是一个非常简单快捷部署MySQL技术的一个工具套件,它可以让你在同一台机器上,更加快速的无干扰的去达到你的最终目的,比如,作为软件测试人员只是要测试软件系统的良好性不需要在mysql的安装上纠缠过多...

啰嗦(可跳过)

前几天面试,笔试时遇到这道题,读了几遍题目都是懵懵懂懂,“一个段时间内至少N天,这N天中每天的分数总和要大于M”,好绕,最后没有写对。

今天想起来这道题,写出了答案并进行了sql语句的验证。

推荐:《mysql视频教程》

问题

某游戏使用mysql数据库,数据表 scores 记录用户得分历史,uid 代表用户ID, score 表示分数, date 表示日期,每个用户每天都会产生多条记录。

数据结构以及数据行如下:

现在需要一份用户列表,这些用户在2017年3月份的31天中,至少要有16天,每天得分总和大于40分。使用一条sql语句表示。

思路

重新梳理需求,画出重点。

现在需要一份用户列表,这些用户在2017年3月份的31天中,至少要有16天,每天得分总和大于40分。使用一条sql语句表示。

连接NAS里MySQL数据库的方法_MySQL教程

MySQL作为开放源代码的数据库管理系统,任何人都可以在GeneralPublicLicense的许可下下载并根据个性化的需要对其进行修改。您可以在TOS 中安装MySQL 服务器,以便您通过MySQL 高效的管理您的数据。

用户列表

代表一个不重复的 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
    uid
FROM
    (
        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 a
GROUP BY
    uid
HAVING
    count(*) > 1;
-- 答案是:
uid : 1

以上就是关于一道mysql查询面试题的思考解决过程的详细内容,更多请关注ki4网其它相关文章!

由mysql8降级到mysql5的方法_MySQL教程

最近在研究liferay的使用。liferay可以连接mysql数据库。电脑中装的mysql的最新版本是mysql8。于是开始按照liferay的要求进行连接。

扫描二维码推送至手机访问。

版权声明:本文由搜教程网发布,如需转载请注明出处。

本文链接:https://www.sojiaocheng.cn/17510.html

标签: mysql
分享给朋友:

“关于一道mysql查询面试题的思考解决过程_MySQL教程,mysql” 的相关文章

SQL中的有哪几种数据类型【MySQL教程】,类型,数据,几种

SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型 扼要形貌一下SQL中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型 字符型 VARCHAR 和 CHAR VARCHAR型和CHAR型数据的这个差异是纤细的,然则非常重要。他们都是用来贮存字符串长度小于255的字符。...

MySQL慢查询日记的设置以及运用教程详解【MySQL教程】,MySQL,以及,配置

MySQL慢查询日记的设置以及运用教程详解【MySQL教程】,MySQL,以及,配置

慢查询日记用于纪录一些过慢的查询语句,能够协助管理员剖析问题所在,下面这篇文章重要给人人引见了关于MySQL慢查询日记的设置与运用教程,文中经由过程示例代码引见的异常细致,须要的朋侪能够参考下。 媒介 MySQL慢查询日记是我们在一样平常事情中经常会碰到的一个功用,MySQL慢查询日记供应了...

MySQL ODBC 3.51 Driver设置时涌现Access Denied的问题解决【MySQL教程】,Driver,MySQL,3.51

MySQL ODBC 3.51 Driver设置时涌现Access Denied的问题解决【MySQL教程】,Driver,MySQL,3.51

MySQL ODBC 3.51 Driver - Access Denied 同事反应在应用效劳器上设置MySQL ODBC 3.51 Drive时,测试衔接MySQL数据库时报下面毛病: ERROR [HYT00] [MySQL][ODBC 3.51 Driver]Access d...

MYSQL完成防备增加购物车反复的代码实例【MySQL教程】,MYSQL,购物车,添加

在向mysql中插进去数据的时刻最须要注意的就是防备反复发增加数据,下面这篇文章主要给人人引见了关于MYSQL怎样完成增加购物车的时刻防备反复增加的相干材料,文中经由历程示例代码引见的异常细致,须要的朋侪能够参考自创,下面来一同看看吧。 媒介 近来由于事情的缘由,在做APP购物车下单付出这一...

MySQL慢查询日记相干的设置和运用【MySQL教程】,MySQL,配置,相关

MySQL慢查询日记相干的设置和运用【MySQL教程】,MySQL,配置,相关

MySQL慢查询日记供应了凌驾指定时刻阈值的查询信息,为机能优化供应了重要的参考根据,是一个异常有用的功用,MySQL慢查询日记的开启和设置异常简朴,能够指定纪录的文件(或许表),凌驾的时刻阈值等就能够纪录到慢sql了,真话讲,相比较sqlserver的trace或许扩大事宜(虽然此两者的作用并不...

mysql中DAO形式【MySQL教程】,mysql,模式

JDBC封装 长处: 断绝细节 下降代码间耦合性 进步代码可扩展性和保护性 附注: DAO形式供应了接见关联型数据体系所需操纵的接口,将数据接见和营业逻辑离开,对 上层供应面向对象的数据接见接口. DAO形式完成两层星散: 代码间分工明白,数据接见层代...