Mysql 分割字符串,一行变多行,@rownum,mysql.help_topic

1 前言

    朋友最近遇到一个比较棘手的 sql 问题,让我帮忙看看:

        他有两张表 testatestb ,一个表存的日期,另一个表存字符串例如 2023-11-01,2023-11-02,如何将这两张表关联起来,只查 testa 表的数据(关联的时候,其中只要在 testb 表中的字符串有这个日期,就要将 testa 表是这个日期的记录的所有字段都查出来)。

    我当时看的时候,觉得这个还挺简单的,想着用 in 或者 like 就行了,后发现都不是正解,于是便有了这篇文章产生。

2 建表和插入测试数据

## testa 表 (每个日期一条数据,日期的格式含秒)
CREATE TABLE `testa` (
  `operator_id` int NOT NULL,
  `stat_date` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

## testb 表(多个日期一条数据,日期以英文字符分隔,日期是 YYYY-MM-DD 形式)
CREATE TABLE `testb` (
  `operator_id` int NOT NULL,
  `rectify_date` varchar(100) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO `testa` (`operator_id`, `stat_date`) VALUES (11, '2024-01-03 00:00:00');
INSERT INTO `testa` (`operator_id`, `stat_date`) VALUES (11, '2024-01-04 00:00:00');
INSERT INTO `testa` (`operator_id`, `stat_date`) VALUES (11, '2024-01-02 00:00:00');
INSERT INTO  testb  (`operator_id`, `rectify_date`) VALUES (11, '2024-01-02,2024-01-04');

3 查询语句

## rectify_date为需要拆分的字段
select a.operator_id, a.stat_date from testa a , 
      ( SELECT @rownum := @rownum + 1 as rownum ,
                       t2.operator_id as operator_id,
	                   SUBSTRING_INDEX(SUBSTRING_INDEX(t2.rectify_date, ',', t3.help_topic_id + 1), ',', - 1) as rectify_date
        FROM (SELECT @rownum := 0) t1 , testb t2 
		JOIN mysql.help_topic t3 ON t3.help_topic_id < (LENGTH(t2.rectify_date) - LENGTH(REPLACE(t2.rectify_date, ',', '')) + 1) 
		 ) b 
where SUBSTR(a.stat_date,1,10) = b.rectify_date

在这里插入图片描述

4 涉及知识点

4.1 @rownum

自定义变量,通过赋值语句 @rownum:=@rownum + 1 来累加达到递增行号的需求。
( @rownum 是自定义变量而不是 Mysql 的函数,所以名字是可以随便取的比如 @rowNo @aaa @bbb 皆可。)

4.2 help_topic

系统自带的辅助表,mysql.help_topic 表的 id 特点是从 0 开始递增,最大为 681
详见《mysql.help_topic 数量/最大值上限查询》

4.3 SUBSTRING

字符串截取,SUBSTRING(str,pos,len)

  • str 要截取的字符串
  • pos 开始截取字符串的下标位置
  • len 需要截多长

4.4 SUBSTRING_INDEX

切割字符串,SUBSTRING_INDEX(str,delim,count)

  • str 表示要进行分割的字符串
  • delim 表示分割符
  • count表示要返回的子串的个数

5 总结

  • 总体上来说,还是挺简单的,主要是依靠一张辅助表,将一行有规律的数据拆分成多行。然后再配合一些常用函数来做切割;
  • 也可以考虑放在 java 代码中的 for 循环处理实现,不过数据量较大的情况下,会很吃 java 内存。java 和 数据库两个层面处理,各有利弊,具体看哪块的资源比较多,自行参考即可;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是负载均衡?什么情况下又会用到负载均衡

什么是负载均衡 在大型的网络应用中&#xff0c;使用多台服务器提供同一个服务是常有的事。平均分配每台服务器上的压力、将压力分散的方法就叫做负载均衡。 [利用 DNS来实现服务器流量的负载均衡&#xff0c;原理是“给网站访问者随机分配不同ip”] 什么情况下会用到负载均…

WAF的概念、分类和应用

WAF&#xff08;Web Application Firewall&#xff0c;Web应用防火墙&#xff09;是一种保护Web应用程序的安全工具&#xff0c;它可以监控、过滤和阻止Web应用程序和互联网之间的HTTP流量。WAF通常可以防御一些常见的Web攻击&#xff0c;如跨站请求伪造&#xff08;CSRF&#…

救命,现在当行政真的可以不用太老实

行政的姐妹在哪里啊&#xff1f;这个打工工具真的要知道哦&#xff01; 信我&#xff0c;真的好用啊&#xff01;终于不用自己写总结写材料的啊&#xff01; 这东西写啥都可以&#xff0c;只要输入需求马上就写好了啊&#xff0c;什么工作总结&#xff0c;活动策划方案&#…

Security的入门和流程分析

Security的入门和流程分析 问题&#xff1a;访问一个controller方法之前进行一个权限验证&#xff1f; 在controller里面的每一个handler无论什么访问都要进行一个校验&#xff0c;但是对于login logout 验证码这种Handler处理器是放行的 1.使用过滤器拦截器 注意两者区别 过滤…

2023中国PostgreSQL数据库生态大会-核心PPT资料下载

一、峰会简介 大会以“极速进化融合新生”为主题&#xff0c;探讨了PostgreSQL数据库生态的发展趋势和未来方向。 在大会主论坛上&#xff0c;专家们就PostgreSQL数据库的技术创新、应用实践和生态发展进行了深入交流。同时&#xff0c;大会还设置了技术创新&云原生论坛、…

计算机创新协会冬令营——暴力枚举题目05

这道题挺基础但是挺多坑的。(•́へ•́╬) 题目 204. 计数质数 - 力扣&#xff08;LeetCode&#xff09; 给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 示例 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;4 解释&#xff1a;小于 10 的质…

手机与电脑投屏互联方案

手机 to 电脑 无线显示器 搜索"无线显示器"找到系统自带的应用 没有的话, 可能需要安装一下 电脑上打开无线显示器 手机中打开投屏 就投上去了, 感觉很卡, 不是很流畅,但是是系统自带的功能, 比较方便 无法连接时可以检查一下这里的设置 scrcpy screen copy 屏幕…

Socket与TCP的关系

前言 相信大家对于TCP已经非常熟悉了&#xff0c;学习过计算机网络的同学对于它的连接和断开流程应该已经烂熟于心了吧。 那么Socket是什么&#xff1f; Socket是应用层与TCP/IP协议簇通信的中间软件抽象层&#xff0c;它是一组接口。在设计模式中&#xff0c;Socket其实就是…

2023 北京国炬软件年度总结—JeecgBoot与敲敲云

2023年对于北京国炬软件公司来说是一个充满成就和创新的一年。 我们成功推出了APass零代码平台—敲敲云&#xff0c;一款能够在5分钟内搭建应用的新一代零代码平台。自2023年1月1号正式上线以来&#xff0c;敲敲云已经突破了10万注册用户&#xff0c;并与数百家战略合作伙伴达…

解决mock单元测试中 无法获取实体类xxx对应的表名

错误描述&#xff1a;在执行单元测试时&#xff0c;执行到new Example时抛出异常&#xff0c;提示无法获取实体类xxx对应的表名 Example example new Example(ServeSubscribeRecord.class);Example.Criteria criteria example.createCriteria();criteria.andEqualTo("se…

记一次:Python的学习笔记四(Gatway网关配置python服务)

前言&#xff1a;如果我后台是spring cloud&#xff0c;单独一个模块是Python写的服务如何集成进来呢&#xff1f;于是乎如下 1、gatway网关配置 # python服务- id: xxx-pythonuri: lb://xxx-pythonpredicates:- Path/python/**filters:- StripPrefix1 2、请求网关地址&#…

如何在 Ubuntu 20.04 上安装和使用 Docker

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 如何在 Ubuntu 20.04 上安装和使用 Docker 介绍 Docker是一个可以简化容器中应用程序进程管理过程的应用程序。…

网络割接为什么经常是半夜进行?

你们好&#xff0c;我的网工朋友。 假设你最近遇到了一个客户&#xff0c;客户有个新的园区刚刚建成&#xff0c;园区内包括建筑物若干&#xff0c;地理覆盖面也较广&#xff0c;园区建成后&#xff0c;肯定是需要一个专用网络的&#xff0c;用于承载公司的业务流量。 这时候&…

芯课堂 | LVGL基础知识(三)

概述 LVGL进度条对象上有一个背景和一个指示器。指示器的宽度根据进度条的当前值进行设置。 如果对象的宽度小于其高度&#xff0c;则可以创建垂直进度条。 不仅可以设置进度条的结束值&#xff0c;还可以设置进度条的起始值&#xff0c;从而改变指示器的起始位置。 LVGL进度…

【ESP32接入语言大模型之通义千问】

1. 通义千问 讲解视频&#xff1a; ESP32接入语言大模型之通义千问 随着人工智能技术的不断发展&#xff0c;自然语言处理领域也得到了广泛的关注和应用。通义千问由阿里云开发&#xff0c;目标是帮助用户获得准确、有用的信息&#xff0c;解决他们的问题和困惑&#xff0c;也…

C# OpenCvSharp DNN FreeYOLO 目标检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 目标检测 效果 模型信息 Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Float[1, 3, 192, 320] --------------------------------------------------------------- Outp…

C# OpenCvSharp DNN Gaze Estimation

目录 介绍 效果 模型信息 项目 代码 frmMain.cs GazeEstimation.cs 下载 C# OpenCvSharp DNN Gaze Estimation 介绍 训练源码地址&#xff1a;https://github.com/deepinsight/insightface/tree/master/reconstruction/gaze 效果 模型信息 Inputs ----------------…

书生·浦语大模型实战营第一次课堂笔记

书生浦语大模型全链路开源体系。大模型是发展通用人工智能的重要途径,是人工通用人工智能的一个重要途径。书生浦语大模型覆盖轻量级、重量级、重量级的三种不同大小模型,可用于智能客服、个人助手等领域。还介绍了书生浦语大模型的性能在多个数据集上全面超过了相似量级或相近…

PMP证书考下来要多少费用?

PMP考试形式分为&#xff1a;笔试、机考。PMP考试这里只着重介绍笔试&#xff08;大陆地区目前都是笔试&#xff09;&#xff1a; PMP认证考试在大陆内的考试一般一年举行四次&#xff0c;分别在3、6、9、12月份。2024年考试时间是3、5、8、11月份。 考试方式是笔试。考试改版…

stable diffusion 人物高级提示词(四)朝向、画面范围、远近、焦距、机位、拍摄角度

一、朝向 英文中文front view正面Profile view / from side侧面half-front view半正面Back view背面(quarter front view:1.5)四分之一正面 prompt/英文中文翻译looking at the camera看向镜头facing the camera面对镜头turned towards the camera转向镜头looking away from …