mysql拆分字符串做条件查询
mysql拆分字符串作为查询条件
有个群友问一个问题
这表的ancestors列存放的是所有的祖先节点,以,
分隔
例如我查询dept_id为103的所有祖先节点,现在我只有一个dept_id该怎么查
然后我去网上找到这样一个神奇的sql,改改表名就成了下面的这样
SELECT
substring_index( substring_index( a.ancestors, ',', b.help_topic_id + 1 ), ',',- 1 ) AS shareholder
FROM
sys_dept a
JOIN mysql.help_topic b ON b.help_topic_id < ( length( a.ancestors ) - length( REPLACE ( a.ancestors, ',', '' ) ) + 1 )
WHERE
dept_id = 103
嗯,没错结果出来了,然后我就很好奇,什么原理,一个个来看
mysql.help_topic
这个是一个mysql自带的帮助解释注释表,查询结果如下
id从0开始,我这个版本最大id到584,版本不同应该id最大值也不一样,这个表的作用一会说
REPLACE
这个函数应该都知道吧,替换字符用的
LENGHT
获取字符串的长度
substring_index
查分字符串,三个参数,要拆分的字符串,根据拆分的字符,从第几个开始
如果最后的那个参数为正数则从左开始数,然后获取对应下标左边的所有字符
如果为负数,则从右边开始数,获取对应下标右边的所有字符串,这个就不演示了
分析
先来看第一段
( length( a.ancestors ) - length( REPLACE ( a.ancestors, ',', '' ) ) + 1 )
我们假设当前数据的ancestors值为 0,100,101
那么第一个length(a.ancestors)
的值就是9 减去后面的一段
length( REPLACE ( a.ancestors, ',', '' ) )
因为我们假设的值里面有两个 ,
所以length为7 最后在加1 那么这段值为 3
和前面的 join on条件能查出的数据也就是mysql.help_topic
这个表中所有id小于3的数据,也就是id为0,1,2的三条数据
那么现在先来看看这样查询的结果是啥
那么我们假设现在是第一行,mysql.help_topic
表中的help_topic_id
为0
substring_index( substring_index( a.ancestors, ',', b.help_topic_id + 1 ), ',',- 1 )
最里面的substring_index 拆分后为0,因为没有能在拆分的了所以外面的substring_index返回的也是0
第二行help_topic_id
为1的时候获取结果为0,100
然后执行外层的substring_index 根据,
拆分,值为-1 所以从右边找一位,获取的值就是100
第三行结果为0,100,101
,外层substring_index 执行后结果为101
....只能心中大喊牛逼
那么现在知道mysql.help_topic
这个表的作用了吗?就是用来对拆分出的数据分行,专业点叫笛卡尔积
(真的不懂..)
这种方法也有缺点:就是拆出的行数不能大于mysql.help_topic
这个表的数据条数
mysql拆分字符串做条件查询的更多相关文章
- mysql增删改查——条件查询+模糊查询
条件查询一般是 = 等于 >大于 <小于 >=大于等于 <=小于等于 <>区间 between and区间 or并且 and或者 in包含 like模糊查询 实例, ...
- mysql根据分组和条件查询以后如何统计记录的条数
1.子查询,查询出的数据随便起一个别名,然后根据分组和条件查询出的数据,作为一个具有一列的一个表,然后外面的查询查询这个数据表的这一列的总数,即可. SELECT COUNT( * ) FROM ( ...
- 用Set中元素做条件查询
一个老师教许多学生,一个学生被许多老师教,一个学生有好多书,同一种书被许多同学拥有.查询教拥有书"a"的学生的老师: class teacher{ String id; ...
- mysql where语句多条件查询是and和or联合使用bug
公司项目中有段功能是全局搜索框和下拉列表的联合查询,在联调开发中发现单独用下拉查询是正确的,单独用全局搜索框也是正确的,测试发现是sql语法有问题. 问题截图: 出现问题的核心还是在于搜索框是用于多个 ...
- mysql 中字符串拼接,查询sql语句总结
DELIMITER $$ USE `ld_wpfmgl_sys`$$ DROP PROCEDURE IF EXISTS `code_query`$$ CREATE DEFINER=`root`@`%` ...
- laravel读取memcached缓存并做条件查询
public function onlineplayersource() { $res = $_POST['aoData']; $sEcho = 0; $iDisplayStart = 0; // 起 ...
- mysql之单表条件查询
create table staff_info( id int primary key auto_increment, name varchar(32) not null, age int(3) un ...
- linq字符串搜索条件,排序条件-linq动态查询语句 Dynamic LINQ
在做搜索和排序的时候,往往是前台传过来的字符串做条件,参数的数量还不定,这就需要用拼sql语句一样拼linq语句.而linq语句又是强类型的,不能用字符串拼出来. 现在好了,有个开源的linq扩展方法 ...
- MySQL全面瓦解9:查询的排序、分页相关
概述 数据库中的数据直接呈现出来一般不是我们想要的,所以我们上两节演示了如何对数据进行过滤的方法.除了对数据进行过滤, 我们可能还需要对数据进行排序,比如想从列表中了解消费最高的项,就可能需要对金额字 ...
随机推荐
- C#常见控件与SQL Sever数据库交互
C#常见控件与SQL Sever数据库交互 下拉框(ComboBox)与数据库绑定 首先,我们采用DataSet作为临时的数据库,这样会比较好 那么,我们先创建两个成员(对象) string sqlc ...
- day01-从一个基础的socket服务说起
首发地址:day01-从一个基础的socket服务说起 教程说明:C++高性能网络服务保姆级教程 本节目的 实现一个基于socket的echo服务端和客户端 服务端监听流程 第一步:使用socket函 ...
- 攻防世界-MISC:pure_color
这是攻防世界高手进阶区的第六题,题目如下: 点击下载附件一,得到一张空白的png图片 用StegSolve打开,然后点击箭头(如下图所示) 多点击几次,即可得到flag 所以,这道题的flag如下: ...
- 看完复旦博士用Python统计核酸结果后,我照着也写了一个
前几天,人民日报公众号报道了复旦博士生自己写代码,通过OCR和正则表达式统计核酸截图结果.具体文章见:https://mp.weixin.qq.com/s/l8u9JifKDlRDoz32-jZWQg ...
- [笔记] 有向无环图 DAG
最小链覆盖 (最长反链) 最小链覆盖 \(=n-\) 最大匹配. 考虑首先每个点自成一条链,此时恰好有 \(n\) 条链,最终答案一定是合并(首尾相接)若干条链形成的. 将两点匹配的含义其实就是将链合 ...
- 流量录制回放工具jvm-sandbox-repeater入门篇——服务部署
趋于当前技术不断更新.产品功能多元化之下,流量回放的热度也是越来越高. 在前一段时间,测试团队也提到阿里开源的流量回放工具 jvm-sandbox-repeater 我个人就先尝试一下,期间还是遇到一 ...
- 为什么不建议给MySQL设置Null值?《死磕MySQL系列 十八》
大家好,我是咔咔 不期速成,日拱一卒 之前ElasticSearch系列文章中提到了如何处理空值,若为Null则会直接报错,因为在ElasticSearch中当字段值为null时.空数组.null值数 ...
- 腾讯tbs 内存泄露
一.背景 TBS(腾讯浏览服务)是腾讯提供的移动端webview体验的整套解决方案(https://x5.tencent.com/docs/index.html),可以用于移动端加载doc.xls.p ...
- 用NetworkX生成并绘制(带权)无向图
NetworkX是一个非常强大的网络科学工具,它封装了图的数据结构和许多经典图算法,也内置了许多可视化函数可供调用. 1. 随机图生成 最经典的随机图当属我们在上一篇博客<Erdos-Renyi ...
- 1903021121-刘明伟-java第七周作业-客户类测试
项目 内容 课程班级博客链接 19信计班(本) 作业要求链接 作业要求链接 博客名称 1903021121-刘明伟-java第七周作业-客户类测试 要求 每道题要有题目,代码,截图 第一部分: 创建客 ...