一 前言

1、mysql没有层级查询方法 而 oracle通过connect by  start with语法可以实现层级查询

2、mysql实现层级查询的方式很多,有使用存储过程函数嵌套调用亦有使用临时表进行层级查询

3、本文使用一种变量循环赋值方式进行,可以套用模版

二 实验

-- 创建测试表
-- DROP TABLE IF EXISTS `test_tree`;
CREATE TABLE `test_tree` (`id` varchar(10) DEFAULT NULL,`name` varchar(10) DEFAULT NULL,`pId` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 创建测试数据(根节点默认-1)
INSERT INTO `test_tree` VALUES ('1', '中国', '-1');
INSERT INTO `test_tree` VALUES ('2', '福建省', '1');
INSERT INTO `test_tree` VALUES ('3', '海南省', '1');
INSERT INTO `test_tree` VALUES ('4', '泉州市', '2');
INSERT INTO `test_tree` VALUES ('5', '福州市', '2');
INSERT INTO `test_tree` VALUES ('6', '泉港区', '4');
INSERT INTO `test_tree` VALUES ('7', '惠安县', '4');
-- 模版 表名代替test_tree  用id替换以下id 用pid替换以下 用其他从属字段替换name
SELECTname,id,pid,@le:= IF (pid = -1 ,0,IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1,@le+1) ) levels,@pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel,@pathnodes:= IF( pid =-1,',root', CONCAT_WS(',',IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1),@pathnodes ) ,pid ) )paths,@pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall
FROM test_tree,
(SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:=''
)  vv
ORDER BY pid,id-- 结合instr(paths,'想要查所有子集的父级id')>0 验证
SELECT
name,
id,
pid,
levels,
paths
FROM (SELECTname,id,pid,@le:= IF (pid = -1 ,0,IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1,@le+1) ) levels,@pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel,@pathnodes:= IF( pid =-1,',root', CONCAT_WS(',',IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1),@pathnodes ) ,pid ) )paths,@pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall FROM test_tree, (SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='')  vvORDER BY pid,id
) src
WHERE instr(paths,'-1')>0
ORDER BY pid

三 验证结果

1、数据

2 查询中国

SELECT
name,
id,
pid,
levels,
paths
FROM (SELECTname,id,pid,@le:= IF (pid = -1 ,0,IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1,@le+1) ) levels,@pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel,@pathnodes:= IF( pid =-1,',root', CONCAT_WS(',',IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1),@pathnodes ) ,pid ) )paths,@pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall FROM test_tree, (SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='')  vvORDER BY pid,id
) src
WHERE instr(paths,'1')>0
ORDER BY pid

3 查询福建省

SELECT
name,
id,
pid,
levels,
paths
FROM (SELECTname,id,pid,@le:= IF (pid = -1 ,0,IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1,@le+1) ) levels,@pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel,@pathnodes:= IF( pid =-1,',root', CONCAT_WS(',',IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1),@pathnodes ) ,pid ) )paths,@pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall FROM test_tree, (SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='')  vvORDER BY pid,id
) src
WHERE instr(paths,'2')>0
ORDER BY pid

mysql 实现 connect by start with相关推荐

  1. mysql 的connect 设置 无法点next_技术分享 | MySQL 使用 MariaDB 审计插件

    作者:姚远 专注于 Oracle.MySQL 数据库多年,Oracle 10G 和 12C OCM,MySQL 5.6 ,5.7,8.0 OCP.现在鼎甲科技任顾问,为同事和客户提供数据库培训和技术支 ...

  2. nodejs连接mysql报connect ECONNREFUSED错误的解决方法

    通过AMH面板安装的mysql,用nodejs连接mysql时候结果报[connect ECONNREFUSED]连接错误. 解决方法:添加socketPath 有些mysql 安装的时候不是mysq ...

  3. Solving a “communications link failure” with jdbc and mysql :Cannot connect to database server Commu

    当出现: Cannot connect to database server Communications link failure 错误时,可以考虑下面的文章: http://stackoverfl ...

  4. mysql connec_mysql++ Connect

    对于一个简单的数据库应用,对于数据库的访问不是很频繁,这时在需要访问数据库时,新创建一个连接,用完后就关闭它,这样做也不会带来什么明显的性能上的开销.但是对于一个复杂的数据库应用,情况就完全不同了,频 ...

  5. 安装 Python MySQL 驱动(mysql-connector-python、MySQL-python)

    1. 安装 由于 MySQL 服务器以独立的进程运行,并通过网络对外服务,所以,需要支持 Python 的MySQL 驱动来连接到 MySQL 服务器. 目前,有两个MySQL驱动: mysql-co ...

  6. mysql connector python linux_MySQL Connector/Python 安装、测试

    安装Connector/Python: # wget http://cdn.mysql.com/Downloads/Connector-Python/mysql-connector-python-1. ...

  7. Mysql 基于 Amoeba 的 读写分离(2)

    <?xml version="1.0" encoding="gbk"?> <!DOCTYPE amoeba:configuration SYS ...

  8. mysql分库分表分页查询语句_MySQL分库分表分库后的查询(8th)

    前言 这边我们以使用python程序要展示一下再分库分表后,我们需要如何对数据库进行操作. python操作数据库 我们这边还是沿用之前的那5中:场景1:购买者下订单#!/usr/bin/env py ...

  9. python连接MySQL并进行数据查询

    python连接MySQL并进行数据查询 #建立数据库的连接 mydb = mysql.connector.connect(host="0.0.0.0",user="ro ...

最新文章

  1. 一起来了解React的四种优秀甘特图方案(下篇)
  2. SP348 EXPEDI - Expedition(有趣的贪心,优先队列)
  3. 深度学习目标检测(object detection)系列(一) R-CNN
  4. linux文件目录操作实验报告,Linux操作系统实验4文件和目录操作
  5. 并查集【CF731C】Socks
  6. SAP系统和微信集成的系列教程之七:使用Redis存储微信用户和公众号的对话记录
  7. 简述List、Set、Map类型的集合的各自特点
  8. html禁止输入字符,javascript – 如何限制在html表中使用的contenteditable中的字符输入...
  9. 买不买D50的N个理由
  10. IOS底层数据结构--class
  11. SUBSTRING_INDEX
  12. 鸿蒙系统屏幕录制,全屏幕录制可以隐藏选项窗口么
  13. flutter 获取wifi名称以及Android10获取不到wifi名称<unknown ssid>
  14. js获取元素下的第一级子元素
  15. 没有NAS也要搭建私有云?花生棒+硬盘的一个任性玩法
  16. 截取计算机全屏画面的方法有,全屏截图快捷键的快捷键是什么
  17. cuDNN免官网创建账户登陆迅雷下载网址
  18. c++游戏编程三国杀
  19. 字节和unicode
  20. 微信怎么建群?三种方法,总有一种适合你!

热门文章

  1. 全球名校AI课程库(1)| 深度学习专项课程『Deep Learning Specialization』
  2. 什么样的男人能轻松泡到妞?
  3. Linux默认root密码设置
  4. 今天是微信7周年 7年之痒 一切都已被改变
  5. 戴尔系统出厂恢复出厂设置_如何恢复出厂设置
  6. python爬取汽车之家图片,Python requests 爬取汽车之家全部品牌logo,urllib下载到本地...
  7. 2015年二本投档线
  8. lda主题模型 python_主题模型LDA
  9. matlab画十七边形,怎么样用尺规作图画正十七边形
  10. 从低代码到无代码:可视化逻辑编排