力扣刷MySQL-第三弹(详细讲解)

 🎉欢迎您来到我的MySQL基础复习专栏

☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克🍹
✨博客主页:小小恶斯法克的博客
🎈该系列文章专栏:力扣刷题讲解-MySQL
🍹文章作者技术和水平很有限,如果文中出现错误,希望大家能指正🙏
📜 感谢大家的关注! ❤️

​​

目录

 🚀删除重复电子邮箱

 🚀上升的温度


🚀删除重复电子邮箱

表: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+
id 是该表的主键列(具有唯一值的列)。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。

编写解决方案 删除 所有重复的电子邮件,只保留一个具有最小 id 的唯一电子邮件。

(对于 SQL 用户,请注意你应该编写一个 DELETE 语句而不是 SELECT 语句。)

运行脚本后,显示的答案是 Person 表。驱动程序将首先编译并运行您的代码片段,然后再显示 Person 表。Person 表的最终顺序 无关紧要 。

返回结果格式如下示例所示。

示例 1:

输入: 
Person 表:
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+
输出: 
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+
解释: john@example.com重复两次。我们保留最小的Id = 1。

解法一:

1.分组

2.首先,题目也提示删除我们要用delete,而不是select

3.众所周知,delect不能删除某个字段的值,这点很重要,温习一下

4.要求是保留每个唯一电子邮件地址对应的最小 id。自然地,我们可以考虑使用 group by 方法来实现这一点。

5.Person.group by('email') 将根据 email 列中的唯一值对 Person 进行分组。我们根据 email 列中的唯一值将 Person 分成多个组。

6.这种分组允许我们将具有相同 email 的行分组在一起,以便我们可以分别对每个组进行操作。

7.那么我们接下来实现一下

8.select * from person group by email (给邮件分组)

9.那么分组之后的情况就是,组1是john@example.com和john@example.com,组2是bob@example.com

10.那么我们再查找每个组唯一的电子邮件的最小id,用到了聚合函数

11.select min(id) from person group by email

12.然后我们要去选择最小的id的值也就是min(id),我们最好给它起一个别名,但最好不要是id,如果是id,因为我们等一下要在它外面还要套一个select去查询这个id,所有很容易与表中的id弄混,我们这里给它起名为id1

13.之后我们在外面套一个select,去查询这个最小id

14.select id1 from (SELECT MIN(id) AS id1 FROM Person GROUP BY email)

15.除此之外我们就想到了用not in,不在这个id1只能的数,我们给它删了,很明显每个组最小的id就是一个是1,一个是2,那么3不是1和2,那么我们就删了,用where

16.SELECT id1 FROM (SELECT MIN(id) AS id1 FROM Person GROUP BY email)

17.DELETE FROM Person WHERE id NOT IN (SELECT id1 FROM (SELECT MIN(id) AS id1 FROM Person GROUP BY email)AS temp);

18.很多人看不懂为什么外面好像多套了一个select,不能没有这个嘛?

19.不能写成

DELETE FROM Person
WHERE id NOT IN (SELECT MIN(id) AS id1FROM PersonGROUP BY email
);

20.不行,这样会报错,因为删除和查询不能同时作用在一张表,如果您在查询中使用了与删除操作相同的表,可能会导致不可预测的结果。这是因为,在 MySQL 中,删除操作会立即从表中删除符合条件的行。因此,如果您在查询中使用了一个已经被删除的行,那么查询结果就会不正确。

21.此时我们就可以用套一个子查询的办法,包装一下避免这个错误,同时也要取上别名

22.即下面的代码,AS temp其实也就是一个伪装

DELETE FROM Person
WHERE id NOT IN (SELECT id1 FROM (SELECT MIN(id) AS id1FROM PersonGROUP BY email) AS temp
);

 方法二:

自连接,且使用 DELETE 和 WHERE 子句
实现

通过将此表与自身在 Email 列上连接,我们可以得到以下代码。

SELECT p1.*
FROM Person p1,Person p2
WHEREp1.Email = p2.Email ;

然后,我们需要找到具有相同电子邮件地址的其他记录中较大的 id。因此,我们可以在 WHERE 子句中添加一个新条件,如下所示。

SELECT p1.*
FROM Person p1,Person p2
WHEREp1.Email = p2.Email AND p1.Id > p2.Id ;

因为我们已经得到了要删除的记录,所以我们可以将这个语句改为 DELETE。

DELETE p1 FROM Person p1,Person p2
WHEREp1.Email = p2.Email AND p1.Id > p2.Id

作者:力扣官方题解
链接:https://leetcode.cn/problems/delete-duplicate-emails/solutions/2366230/shan-chu-zhong-fu-de-dian-zi-you-xiang-b-8e7p/
来源:力扣(LeetCode)

 🚀上升的温度

表: Weather

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| recordDate    | date    |
| temperature   | int     |
+---------------+---------+
id 是该表具有唯一值的列。
该表包含特定日期的温度信息

编写解决方案,找出与之前(昨天的)日期相比温度更高的所有日期的 id 。

返回结果 无顺序要求 。

结果格式如下例子所示。

示例 1:

输入:
Weather 表:
+----+------------+-------------+
| id | recordDate | Temperature |
+----+------------+-------------+
| 1  | 2015-01-01 | 10          |
| 2  | 2015-01-02 | 25          |
| 3  | 2015-01-03 | 20          |
| 4  | 2015-01-04 | 30          |
+----+------------+-------------+
输出:
+----+
| id |
+----+
| 2  |
| 4  |
+----+
解释:
2015-01-02 的温度比前一天高(10 -> 25)
2015-01-04 的温度比前一天高(20 -> 30)

解题思路:

首先,我们需要找到每一天与前一天的温度比较情况。这可以通过自连接(self-join)来实现,即将 Weather 表与自身连接,以便比较相邻日期的温度情况。

  1. 自连接表: 首先,我们对 Weather 表进行自连接,以便能够比较相邻日期的温度情况。我们将使用 w1 和 w2 作为表的别名,分别代表连接中的两个不同实例。

    SELECT w1.id AS w1_id, w1.recordDate AS w1_date, w1.temperature AS w1_temp,w2.id AS w2_id, w2.recordDate AS w2_date, w2.temperature AS w2_temp
    FROM Weather w1
    JOIN Weather w2 ON DATEDIFF(w2.recordDate, w1.recordDate) = 1;
    

    这将返回一个结果集,其中包含了相邻日期的温度信息。

  2. 筛选条件: 我们需要进一步筛选出温度更高的日期。

    WHERE w2.temperature > w1.temperature
    

    这个条件将确保只有当后一天的温度高于前一天时才会被选择。

  3. 最终结果: 最后,我们只需选择符合条件的日期的 id。

    SELECT w2.id
    FROM Weather w1
    JOIN Weather w2 ON DATEDIFF(w2.recordDate, w1.recordDate) = 1
    WHERE w2.temperature > w1.temperature
    

    这将给出所有温度比前一天更高的日期的 id。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM中的垃圾收集算法

标记-清除算法 首先标记出所有需要回收的对象,在标记完成后,统一回收掉所有被标记的对象,也可以反过来,标记存活的对象,统一回收所有未被标记的对象。标记过程就是对象是否属于垃圾的判定过程 缺点 第一个是执行效率…

C# 获取QQ会话聊天信息

目录 利用UIAutomation获取QQ会话聊天信息 效果 代码 目前遇到一个问题 其他解决办法 利用UIAutomation获取QQ会话聊天信息 效果 代码 AutomationElement window AutomationElement.FromHandle(get.WindowHwnd); AutomationElement QQMsgList window.FindFirst(Tr…

4.postman批量运行及json、cvs文件运行

一、批量运行collection 1.各个接口设置信息已保存,在collection中点击run collection 2.编辑并运行集合 集合运行时,单独上传图片时报错。需修改postman设置 二、csv文件运行 可新建记事本,输入测试数据,后另存为新的文本文件&…

Pytest 结合 Allure 生成测试报告

测试报告在项目中是至关重要的角色,一个好的测试报告: 可以体现测试人员的工作量; 开发人员可以从测试报告中了解缺陷的情况; 测试经理可以从测试报告中看到测试人员的执行情况及测试用例的覆盖率; 项目负责人可以通过…

echarts-wordcloud词云

echarts-wordcloud是基于echarts的一个插件,所以我们要首先安装echarts包,然后再安装echarts-wordcloud的包,这里我的练习项目安装的版本;当然,你可以随意安装你需要的版本; “echarts”: “^5.3.3”, “ec…

面试2024.1.20

简单介绍下你做的项目。 这个神领物流项目是一个前后端分离的项目,前段他有3个客户端(用户端为微信小程序、司机端和快递员端为app)一个管理端(pc),后端用的技术栈用的是SpringAlibabaCloud、数据库用的是M…

【精选】中间件 tomcat漏洞复现

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

JRTP实时音视频传输(2)-使用TCP通信的案例

环境搭建等参考:JRTP实时音视频传输(1)-必做的环境搭建与demo测试 1.创建自己的demo 先将example1拷贝为myclienttcp.cpp和myservertcp.cpp cp example1.cpp myclienttcp.cpp cp example1.cpp myservertcp.cpp 改写jrtplib/JRTPLIB/examples/CMakeLists.txt&…

79、avx2 向量指令集优化卷积运算

上一节 介绍了 avx2 向量指令集中的 load/store 操作,本节介绍如何使用 avx2 的向量指令集来实现乘累加运算。 因为我们实战中用到的 resnet50 神经网络中,卷积运算在整个模型中的比例占据是相当高,而卷积运算的核心计算就是乘累加计算。因此,只要将最核心的乘累加计算效率…

怎么从视频中提取动图?一个方法快速提取gif

视频以连续的方式播放一系列图像帧,通过每秒播放的帧数(帧率)来创做,由于GIF动图则以循环播放一系列静态图像帧的方式展现动画效果。由于视频的优势在于流畅的动画、丰富的细节和长时间播放,因此常用于电影、电视节目、…

如何在 Ubuntu / Raspbian 上安装 MariaDB

Raspberry Pi OS(原为Raspbian)是为树莓派基于Debian开发的操作系统。 从2015年起,树莓派基金会正式将其作为树莓派的官方操作系统。 Raspbian是由Mike Thompson和Peter Green创建的一个独立项目。第一个版本于2012年6月发布,至…

LP-AM243x EtherNet/IP 连接施耐德 M241 EIP主站测试

硬件环境:LP-AM243x 开发板 施耐德 Modicon M241 软件环境: INDUSTRIAL-COMMUNICATIONS-SDK-AM243X MCU-PLUS-SDK-AM243X — MCU SDK for AM243x 调试过程: 首先,让AM243x能够运行 Null Boot, Starting NULL Boo…

Kotlin 尾递归函数

函数式编程中,重要的概念 尾递归。 当一个函数,在函数最后调用 自身,称为 尾递归,是一种特殊的递归函数。 在JVM中,每次方法调用时,都会产生新的栈帧(stack frame),消耗栈…

TCP缓存(C++)

系统为每个 socket 创建了发送缓冲区和接收缓冲区,应用程序调用 send()/write()函数发送数据的 时候,内核把数据从应用进程拷贝 socket 的发送缓冲区中;应用程序调用 recv()/read()函数接收数据的时候,内核把数据从 socket 的接收…

C语言实现简单的扫雷游戏

目录 1 -> test.c 2 -> game.c 3 -> game.h 1 -> test.c #define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu() {printf("************************************\n");printf("********* 1.play ********\n&quo…

【51单片机】动态数码管

0、前言 参考: 普中51单片机开发攻略–A2.pdf 1、数码管介绍 上一章我们主要是介绍一位数码管的内部结构及控制原理。下面我们再来介 绍下多位数码管及动态显示原理的相关知识。 1.1 多位数码管简介 2、74HC245 和 74HC138 芯片介绍 2.1 74HC245 芯片简介 2.2 7…

Docker使用及部署python项目

一、准备项目 ​ 我写的是一个爬取某ppt网站的代码,就一个ppt1.py是爬虫,然后,ppts是存放下载的ppt的 二、准备requirement.txt文件 这个是需要哪些python库支持,写好 ​ 三、准备Dockerfile文件 需要一个名为Dockerfile的文件&…

HarmonyOS关于deps、external_deps的使用

在添加一个模块的时候,需要在BUILD.gn中声明它的依赖,为了便于后续处理部件间依赖关系,我们将依赖分为两种——部件内依赖deps和部件间依赖external_deps。 依赖分类 如上图所示,主要分为部件内依赖(图左)…

Java设计模式-前言

大家好,我是馆长!从今天开始馆长开始对java设计模式进行讲解和整理分享给大家。馆长会尽快的整理完成设计模式的所有内容和讲解代码。从多方面进行模式的详细说明,方便各位看官理解和易学。 软件设计模式的概念 软件设计模式(Sof…

C++笔记之bool类型的隐式转换现象与应用

C++笔记之bool类型的隐式转换现象与应用 —— 《C++ Primer Plus》 文章目录 C++笔记之bool类型的隐式转换现象与应用1.C++中,有几种类型和表达式可以隐式转换为bool类型2.使用explicit关键字来声明显示转换运算符,这样只有在使用static_cast<bool>时才能将对象转换为…