MySQL获取分组中的第一条数据和最后一条数据

2023-10-30

mysql 8

WITH ranked_messages AS (
  SELECT m.*, ROW_NUMBER() OVER (PARTITION BY name ORDER BY id DESC) AS rn
  FROM messages AS m
)
SELECT * FROM ranked_messages WHERE rn = 1;

mysql 8 以前写法

需求:账号表有多条相同的staff_id的数据,按staff_id分组,取ID最大(也就是最新)的一行

方法一

容易出现性能瓶颈

select * from account where id in (
	select max(id) group by account
)

方法二

这里的关键是a.staff_id = b.staff_id,根据业务情况不同,实际是分组group by字段,然后通过左关联(一定是左关联)算出笛卡尔积,通过过滤条件 a.id < b.idb.created_at IS NULL找到数据
反过来a.id > b.id是最小

SELECT
    a.id aid,
    b.id bid
FROM
    account a
    LEFT JOIN account b ON a.staff_id = b.staff_id
        AND a.id < b.id
WHERE
    b.created_at IS NULL
    AND a.staff_id = 1;

原理

不限制查询条件

SELECT
    a.id aid,
    b.id bid
FROM
    account a
    LEFT JOIN account b ON a.staff_id = b.staff_id and a.id < b.id 
WHERE
     a.staff_id = 123;

在这里插入图片描述
从上面结果可以看出a.id < b.id 可以关联出最大的数据是1219(没有任何数据比他大),关联值是null,所以上述基础再加一个条件 b.created_at IS NULL就可以实现需求要的数据

SELECT
    a.id aid,
    b.id bid
FROM
    account a
    LEFT JOIN account b ON a.staff_id = b.staff_id
        AND a.id > b.id
WHERE
    b.created_at IS NULL
and     a.staff_id = 10000034;

生产环境中方法二会比方法一性能高

方法三:存储过程
主要利用@rownum存储过程,操作前需要对数据进行维度排序,自行搜索,这里不介绍,因为写了这样的SQL难以在团队推广,阅读性和维护性更差

总结

已经使用方法二帮助上产环境解决SQL慢的问题,但是问题关键是不应该这样来查数据,极度消耗数据库性能,必要情况下需要冗余一张表来记录对应数据最新的id值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL获取分组中的第一条数据和最后一条数据 的相关文章

  • MS Access:在列中搜索星号/星号

    我正在寻找一种方法来搜索包含字符串数据类型的列 问题是星号或星号是保留符号 以下查询无法正常工作 select from users where instr pattern 如何编写 Access 查询来搜索列中的星号 您可以使用方括号在
  • 使用 LIKE 和撇号的 Mysql 查询问题

    所以我有一个有趣的问题 我从未遇到过 并且似乎找不到太多有关纠正该问题的信息 我有一个庞大的数据库 里面有大量的数据 相当于 10 年的数据 并试图对其进行搜索 现在搜索功能运行良好 但最近有人让我注意到一个 错误 如果你愿意的话 我尝试对
  • 获取jdbc中表依赖顺序

    我在 MySQL 数据库中有一组表 A B C D 依赖关系如下 B gt C gt A 和 D gt A 也就是说 A 有一个 PrimaryKey C 有一个外键指向 A 的主键 B 有一个外键指向 C 的主键 类似地 D 有一个外键指
  • _mysql_connector.MySQLInterfaceError:命令不同步;您现在无法运行此命令 python msql.connector

    我有一个功能 您可以在下面看到 如果运行此函数 我将收到您在标题中看到的错误 您能帮助我吗 不久前我能够用锁解决这个问题 但现在它们不起作用 我知道这与我的连接有关 但我不知道如何解决这个问题 def insertNewValues sel
  • 计算表中的行数

    获取 MySQL 数据库中特定表的总行数的语法是什么 我一直都这么做 SELECT count FROM table 上面将为您提供所有行的总数 您可以轻松添加 WHERE 子句来获取某个子集的计数 SELECT count FROM ta
  • 使用 Laravel Fluent 查询生成器从多个表中进行选择

    我正在重写一些 PHP MySQL 来与 Laravel 一起使用 我想做的一件事是使数据库查询更加简洁使用 Fluent 查询生成器 http laravel com docs database fluent但我有点迷失 SELECT p
  • 从本地 html/javascript 网站插入 mySQL 数据库

    我正在尝试做什么 我的程序的目的是插入数据local HTML JS网站变成online 非本地 mySQL数据库 到目前为止我尝试过的 我试图用来实现此目的的原始方法是让我的本地网站使用 javascript 通过在线发布数据PHP文件
  • 使用 PHP 和 jSON 从 MySQL 获取 UIImage

    我正在开发一个小型新闻阅读器 它通过对 URL 执行 POST 请求来从网站检索信息 响应是一个带有未读新闻的 JSON 对象 例如 应用程序上的最新新闻的时间戳为 2013 03 01 当用户刷新表时 它会发布 domain com ap
  • 向 yahoo 和 hotmail 用户发送电子邮件?

    我正在使用 php 和 mysql 每次用户在我的网站上注册时 我都会使用 php mail 发送一封电子邮件进行身份验证 最近我发现 很多Yahoo和Hotmail用户还没有激活他们的帐户 假设 1000 个用户中 只有 200 个被激活
  • Python 中的 Firebase 身份验证时出现 KeyError:“databaseURL”

    相信你做得很好 我是 firebase 的新手 正在尝试进行用户身份验证 我已经安装了pyrebase4并在firebase控制台上创建了一个项目 我还启用了使用 电子邮件和密码 登录并尝试连接我的应用程序 下面是我正在尝试的代码 impo
  • Mysql:计算访问频率

    我有这张桌子 CREATE OR REPLACE TABLE hits ip bigint page VARCHAR 256 agent VARCHAR 1000 date datetime 我想计算每个页面的 googlebot 访问频率
  • MySQL 查询获取每小时计数

    我需要统计每小时发生的操作次数 我的数据库按操作的时间戳保存日志 我明白我可以做一个 SELECT table time COUNT table time from table t group by t time 然而 也有一段时间没有采取
  • 解析错误:语法错误,意外的“”(T_ENCAPSED_AND_WHITESPACE)[重复]

    这个问题在这里已经有答案了 完整错误 解析错误 语法错误 意外的 T ENCAPSED AND WHITESPACE 需要标识符 T STRING 或 变量 T VARIABLE 或数字 T NUM STRING 它说错误出现在第 12 行
  • 如何在可能为空值的字段上创建唯一索引(Oracle 11g)?

    这是包含 3 列的示例表 ID UNIQUE VALUE UNIQUE GROUP ID 我希望可以允许以下记录 1 NULL NULL 2 NULL NULL or 3 NULL 7 4 123 7 or 注意 此条件不允许unique
  • MySQL - 替换列中的字符

    作为一个自学成才的新手 我给自己制造了一个大问题 在将数据插入数据库之前 我将字符串中的撇号 转换为双引号 而不是 MySQL 实际需要的反斜杠和撇号 在我的表增长到超过 200 000 行之前 我认为最好立即纠正此问题 所以我做了一些研究
  • iPhone表情插入MySQL却变成空值

    我们正在开发一个 iPhone 应用程序 它将表情符号从 iPhone 发送到服务器端 PHP 并插入到 MySQL 表中 我正在做服务器端的工作 但是insert语句执行成功后 插入的值变成空了 我可以正确插入字段 varchar 的是文
  • PHP mysql_num_rows 死错误

    我想创建一个页面 用户可以在其中添加他们的信息 我已经创建了该页面 但我真正的问题是代码 我有一些问题 这部分代码
  • python 没有名为serial的模块

    我的 python 程序有问题 我编写了程序来将数据 温度 从 arduino 获取到我的树莓派 sqlite 数据库 但它在第 4 行 导入串行 处给了我一个错误 提示 ImportError 没有名为串行的模块 我使用 python3
  • 从 JSON 数组创建标记 php mySQL Google Maps v2 android

    我正在尝试从 mySQL 数据库在 Google Maps v2 上创建标记 但它不起作用 地图确实出现了 但没有标记 谁能告诉我出了什么问题以及我需要改变什么 我也尝试过让 getDouble 为 getDouble 0 和 getDou
  • mysql中的按位移位

    如何在 MySQL 中进行按位移位 有没有具体的指令或者操作符 如果不是 如何最佳地模拟它 看一下按位运算符MySQL first http dev mysql com doc refman 5 0 en bit functions htm

随机推荐

  • 透视Matplotlib核心功能和工具包 - Cartopy工具包

    Cartopy是用于在Matplotlib上绘制地理地图的第三方工具包 Cartopy具有各种各样的功能 可以满足许多不同的用户群体 在这里 我们将尝试介绍企业中通常使用的大多数功能 地理地图以经度和纬度绘制 均以度为单位 经度绘制在x轴上
  • Qt编程基础

    一 信号与槽 1 什么是信号与槽 信号和槽是用于对象之间的通信 它是Qt的核心机制 在Qt编程中有着广泛的应用 如果想学好Qt 一定要充分掌握信号的槽的概念与使用 2 信号和槽的代码实例 在Qt中 发送对象 发送的信号 接收对象 槽可以通过
  • ISP(三) 硬阈值函数(Hard Thresholding)与软阈值函数(Soft Thresholding)的区别

    一旦明白 其实简单至极 也就那么回事 常用的软阈值函数 是为了解决硬阈值函数 一刀切 导致的影响 模小于3sigma的小波系数全部切除 大于3sigma全部保留 势必会在小波域产生突变 导致去噪后结果产生局部的抖动 类似于傅立叶变换中频域的
  • 日历插件美化版

    https ext dcloud net cn plugin id 3324
  • 服务器显卡:驱动高性能计算和人工智能应用

    一 引言 随着高性能计算和人工智能应用的不断发展 服务器显卡的性能显得越来越重要 服务器显卡是服务器硬件配置中的一个关键组件 它不仅提供基本的图形渲染能力 还在高性能计算和人工智能应用中发挥着重要作用 本文将探讨服务器显卡的重要性和发展趋势
  • 使用ESP8266 12-E板载的CH340对ESP01-s进行烧录

    先借两张图 因为ESP01 S的烧录器找不到了 临时用ESP8266 12 E板载的CH340对ESP01 s进行烧录 1 12 E的EN引脚接地G 2 ESP01 s的3v3连接12 E的3v3 3 ESP01 s的GND连接12 E的G
  • 【左神算法课学习笔记】动态规划

    左神算法课学习笔记 动态规划 动态规划是对暴力递归算法的优化 主要是通过数组记录的方法 优化掉一些重复计算的过程 总结下动态规划的过程 1 抽象出一种 试法 递归解决问题的方法 很重要 2 找到 试法 中的可变参数 规划成数组表 可变参数一
  • 蓝桥杯官网练习题(李白打酒)

    题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 话说大诗人李白 一生好饮 幸好他从不开车 一天 他提着酒壶 从家里出来 酒壶中有酒2斗 他边走边唱 无事街上走 提壶去打酒 逢店加一倍 遇花喝一斗 这一路上
  • 查看python环境路径_查看python环境的一些知识点

    1 查看python中的查找模块的路径import sys sys path usr bin usr lib64 python26 zip usr lib64 python2 6 usr lib64 python2 6 plat linux
  • CDC处理——异步FIFO

    1 异步FIFO原理 请看 硬件架构的艺术 笔记 三 3 8节 异步FIFO 2 格雷码传递FIFO读写指针 回环特性 通常情况下 设计的异步FIFO的深度是2的N次方 但事实上 选择这个2 N的原因也是因为格雷码这么取的时候 最大值 1回
  • S4 MB5B 结算库存数量与 MMBE 中的数量不同

    用户在查询库存过程中发现MB5B 结算库存数量与 MMBE 中的数量不同 我们知道MMBE是系统的当前库存 MB5B是可以根据输入的日期查询输入日期当天的库存 MMBE查询库存数量为971米 再来看MB5B库存 输入物料 工厂 日期为今天2
  • 在Windows10上安装虚拟机---VMware 17 Pro下载与安装

    在Windows10上安装虚拟机 VMware下载与安装 0 前言 1 下载VMware 17 pro 2 安装VMware 17 Pro 3 打开Vmware 0 前言 电脑原生系统 Windows10 虚拟机软件 VMware 17 p
  • ORACLE随机查询

    1 select from select from tablename order by dbms random value where rownum lt N 注 dbms random是一个可以生成随机数值或者字符串的程序包 value
  • 训练模型的3种方法

    公众号后台回复关键字 Pytorch 获取项目github地址 Pytorch没有官方的高阶API 一般通过nn Module来构建模型并编写自定义训练循环 为了更加方便地训练模型 作者编写了仿keras的Pytorch模型接口 torch
  • STM8普通定时器中断使用寄存器版本

    本文章只讲如何使用STM8的普通定时器 原理以及其他知识点可以网上查阅相关的资料 废话不多说 直奔主题 第一步 了解TIM4的时钟来源 查阅书册可以知道TIM4的时钟来源系统的主时钟 第二步 初始化相关寄存器 从ST官方手册可以知道 TIM
  • Spring Boot的文件上传

    Spring Boot的文件上传并不需要单独进行 当前端进行请求时 所要上传的文件作为请求的一个参数即可 与其他类型参数相同 服务端接收时 只需要对这个文件参数使用MultipartFile类型接收即可 由于文件上传的参数无法直接拼接到UR
  • unplugin-vue-components/vite自动将项目中使用的 Vue 组件按需引入

    unplugin vue components 是一个 Vite 插件 它可以自动将项目中使用的 Vue 组件自动按需引入 以减小打包体积 它的使用方式如下 安装插件 npm install D unplugin vue component
  • 上拉和下拉的解释

    1 什么是上下拉电阻 上拉电阻 把一个不确定的信号通过电阻连接到高电平 是电信号初始化为高电平 下拉电阻 把一个不确定的信号通过电阻连接到地 使电信号初始为低电平 本质 上拉是对器件注入电流 下拉是输出电流 2 上下拉电阻接线方法 上拉电阻
  • Kafka 消费者“group_name”组正在永远重新平衡

    目录 一 场景 1 1 场景应用环境 1 2 问题重现 二 问题分析 三 解决方案 一 场景 1 1 场景应用环境 卡夫卡 2 11 1 0 1 主题 并发度为 5 且分区为 5 1 2 问题重现 当应用程序重新启动并且在分区分配之前在主题
  • MySQL获取分组中的第一条数据和最后一条数据

    mysql 8 WITH ranked messages AS SELECT m ROW NUMBER OVER PARTITION BY name ORDER BY id DESC AS rn FROM messages AS m SEL