首页 > 数据库 >MYSQL级联查询,包括向上向下的级联

MYSQL级联查询,包括向上向下的级联

时间:2023-06-04 17:02:22浏览次数:67  
标签:200 SET -- idParam 查询 级联 MYSQL id sqlStr


-- 名称:mysql递归查询存储过程(2014-04-05) 
-- 入:@table  表名[varchar(200)]
-- 入:@field  要查询返回的字段名(例如:  name,age,remark)[text]
-- 入:@order  返回结果的排序(例如 name desc,age asc)[text]
-- 入:@idName 主键列名[varchar(200)]
-- 入:@pidName父键列名[varchar(200)]
-- 入:@id     主键值[varchar(200)],不能为null,如果值是null,说明要查询全部,请自己查询
-- 入:@upDown 向上级联还是向下级联,1=上 0=下[int]
-- 入:@self   是否包含自己 1=是 0=否[int]
-- 返回查询结果集
DROP PROCEDURE IF EXISTS Query_Dg;
CREATE PROCEDURE Query_Dg
(
    IN table_   VARCHAR(200),
    IN field_   TEXT,
    IN order_   TEXT,
    IN idName_  VARCHAR(200),
    IN pidName_ VARCHAR(200),
    IN id_      VARCHAR(200),
    IN upDown_  INT,
    IN self_    INT
)
BEGIN
DECLARE _sqlStr VARCHAR(4000);  -- 动态sql
DECLARE _idParam VARCHAR(4000);  -- id存放的变量
DECLARE _idSet VARCHAR(4000);  -- 结果
SET @_idSet = '';
-- 查询id开始
IF(self_ = 1)THEN -- 包含自己
    SET @_idSet = id_;
END IF;
-- 递归开始
IF(upDown_ = 1)THEN -- 向上递归
    SET @_sql = CONCAT('SELECT ',pidName_,' INTO @_idParam FROM ',table_,' WHERE ',idName_,' = ?');
ELSE  -- 向下递归
    SET @_sql = CONCAT('SELECT GROUP_CONCAT(',idName_,') INTO @_idParam FROM ',table_,' WHERE FIND_IN_SET(',pidName_,', ?) > 0');
END IF;
SET @_idParam = id_;    -- 输入参数使用时不能 @
PREPARE _sqlStr FROM @_sql;
EXECUTE _sqlStr USING @_idParam;
WHILE @_idParam IS NOT NULL DO
    SET @_idSet = CONCAT(@_idSet,',',@_idParam);
    EXECUTE _sqlStr USING @_idParam;
END WHILE;
-- 查询id结束
SET @_sql = CONCAT('SELECT ',field_,' FROM ',table_,' WHERE FIND_IN_SET(',idName_,', ? ) > 0 order by ',order_); -- 查询
DEALLOCATE PREPARE _sqlStr; -- 解除预编译
PREPARE _sqlStr FROM @_sql; -- 重新预编译
EXECUTE _sqlStr USING @_idSet;
DEALLOCATE PREPARE _sqlStr;
END

标签:200,SET,--,idParam,查询,级联,MYSQL,id,sqlStr
From: https://blog.51cto.com/u_3871599/6411140

相关文章

  • MySQL逻辑架构图
    整体架构MySQL可以分为Server层和存储引擎层两部分。不同的存储引擎(不同的表可以设置不同的存储引擎)共用一个Server层(从连接器到执行器)。查询流程连接器Command列显示Sleep表示空闲连接。如果客户端太长时间没动静,那么连接器会自动将它断开,由参数wait_timeout控制,默认值是8......
  • Java High Level Rest Client---查询文档
    查询文档的基本步骤1)准备Request对象2)准备请求参数3)发起请求4)解析响应示例解析以match_all查询为例代码解读:第一步,创建SearchRequest对象,指定索引库名第二步,利用request.source()构建DSL,DSL中可以包含查询、分页、排序、高亮等query():代表查询条件,利用QueryBuilder......
  • 数据库管理工具远程连接MySQL实例服务失败Host ... is not allowed to connect to thi
    MySQL社区版数据库8.0版本添加账号、分配权限、删除账号MySQL安全连接失败问题排查......
  • Oracle分页查询语句
    Oracle分页查询语句(一)作者:yangtingkun     Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。分页查询格式:SELECT*......
  • 4、数据库:MySQL部署 - 系统部署系列文章
          MySQL数据库在其它博文中有介绍,包括学习规划系列。今天就讲讲MySQL的部署事情。一、先下载MySQL数据库;到下面这个网址去下载数据库,这里下载的社区版:https://dev.mysql.com/downloads/installer/二、安装数据库;打开EXE文件;       ......
  • mysql-5.6.13在windows平台下的安装、使用(图解)
    一、首先电脑要具备.NetFramework4以上环境二、MySQL下载、安装、执行1.下载http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.13-win32.zip2.安装点击“installMySQLproducts”选中“Iacceptthelicenceterms”,点击next选中“Skipthecheckforupdate......
  • Mysql索引类型介绍
    1.定义索引(index)是帮助Mysql高效获取数据的数据结构2.分类主键索引(Primarykey)唯一的标识,主键不可重复,一个表中只能有一个列作为主键唯一索引(Uniquekey)不能重复,一个表中多个列可以标识为唯一索引常规索引(key/index)默认的索引,可以重复,多个列可以标识为常规......
  • MySQL主从复制
    MySQL主从复制一、复制概述将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行,从而使得从库和主库的数据保持同步。MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。二、复制原理My......
  • mybatis 多表关联查询
    MyBatis多表关联查询一对多查询一对多关联查询是指,在查询一方对象的时候,同时将其所关联的多方对象也都查询出来。.Ⅰ、多表连接(联合)查询这种方式只用到1条SQL语句。.注意:即使字段名与属性名相同,在<resultMap></resultMap>中也要写出它们的映射关系。因为框架......
  • MySQL 8错误日志出现"The table /home/work/mysql_3306/tmp/#sqla2b_298b06_4d is fu
    ##############    了解MySQL8.0.26的错误日志出现"Thetable /home/work/mysql_3306/tmp/#sqla2b_298b06_4disfu11!"的bug,暂时通过修改临时表的存储引擎为内存引擎解决  MySQL8.0.13开始引入新的临时内存表引擎TempTable,并将其作为内存中创建临时表的默认存储引擎。T......