MYSQL练题笔记-高级查询和连接-最后一个能进入巴士的人

2023-12-07 16:28

本文主要是介绍MYSQL练题笔记-高级查询和连接-最后一个能进入巴士的人,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、题目相关内容

1)相关的表和题目

2)帮助理解题目的示例,提供返回结果的格式

二、自己初步的理解

一群人要上巴士但是巴士有体重限制,那只能有限个人才能上去

最后输出这个最后一个上去还不超重的人的名字

我认为首先要缩小记录数,只有能上车的人先出现,但是我想不到怎么才能做到。于是还是老老实实看题解吧。                          

三、题解展示和分析

1.官方题解

SELECT a.person_name

FROM Queue a, Queue b

WHERE a.turn >= b.turn

GROUP BY a.person_id HAVING SUM(b.weight) <= 1000

ORDER BY a.turn DESC

LIMIT 1

分析题解过程如下:

1)又是自连接也是交叉连接,通过每个人和其他所有人连接,找到自己在里面的位置,留下之前人和自己即可。

2)将每个人进行分组。

3)现在利用每个分组里自己和之前人的体重之和看看是否大于1000。

真的太巧妙了,这样就筛选出来了

自己回忆和思考的这个题解如下,

select a.person_name from queue a,queue b where a.turn>=b.turn group by a.person_id having sum(b.weight)<=1000 order by b.turn desc limit 1;

并提交上去的时候显示解答错误,如下图,但是由于这个测试用例比较长不方便看,我就如下图添加了下测试用例就在右下角全部显示出来了,然后发现自己的答案和正确答案有区别,order by的字段是不一样的,发现我的是b.turn,正确答案是a.turn。

我筛选出的结果是第16个名字teach前面一个名字,正确答案是后面的名字dragon。

评论区有人问了为什么排序的字段是a.turn,有一个解答但是我还是不理解,怎么想都想不出来,有大佬知道为什么吗?

2.不用自连接的方式,用窗口函数,如下

select person_name

from(select turn,person_name,sum(weight) over(order by turn) as cumu_weight from Queue) t

where cumu_weight <= 1000

order by turn desc

limit 1

sum()over()这个函数如果我之前知道的话,也是倾向于这一种方法的,因为一直猜测有没有函数能做这样的操作。

这个题解的核心就是子查询,利用这个窗口函数把turn排序后的累积相加的体重作为一个字段即可

3.加几个题解里有的不同于上面两个的,等着以后思考

select person_name from Queue q1 where (select sum(weight) from Queue where turn <= q1.turn) <= 1000 order by turn desc limit 1;

select person_name from(select  turn, person_name, sum(weight) over(order by turn) as cumu_weight from Queue) t where cumu_weight <= 1000 order by turn desc limit 1;

四、总结

官方题解有一个不理解的地方,要等着以后思考了,会了sum()overover()窗口函数,多多思考!!

这篇关于MYSQL练题笔记-高级查询和连接-最后一个能进入巴士的人的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/466542

相关文章

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

MySQL错误代码2058和2059的解决办法

《MySQL错误代码2058和2059的解决办法》:本文主要介绍MySQL错误代码2058和2059的解决办法,2058和2059的错误码核心都是你用的客户端工具和mysql版本的密码插件不匹配,... 目录1. 前置理解2.报错现象3.解决办法(敲重点!!!)1. php前置理解2058和2059的错误

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

MySQL Workbench 安装教程(保姆级)

《MySQLWorkbench安装教程(保姆级)》MySQLWorkbench是一款强大的数据库设计和管理工具,本文主要介绍了MySQLWorkbench安装教程,文中通过图文介绍的非常详细,对大... 目录前言:详细步骤:一、检查安装的数据库版本二、在官网下载对应的mysql Workbench版本,要是

mysql数据库重置表主键id的实现

《mysql数据库重置表主键id的实现》在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,本文主要介绍了mysql数据库重置表主键id的实现,具有一定的参考价值,感兴趣的可以了... 目录关键语法演示案例在我们的开发过程中,难免在做测试的时候会生成一些杂乱无章的SQL主键数据,当我们

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

MySQL多列IN查询的实现

《MySQL多列IN查询的实现》多列IN查询是一种强大的筛选工具,它允许通过多字段组合快速过滤数据,本文主要介绍了MySQL多列IN查询的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析与优化1.

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作