精华内容
下载资源
问答
  • 父子查询根据父id查询下面所有子节点数据。功能需求我们这里以sec_org(部门表)为例,在一个部门表里面包含org_id(子部门id)、parent_org_id(父部门id)、org_name(子部门名称)等字段,我们要实现通过传入一个部门id,...

    父子查询

    根据父id查询下面所有子节点数据。

    功能需求

    我们这里以sec_org(部门表)为例,在一个部门表里面包含org_id(子部门id)、parent_org_id(父部门id)、org_name(子部门名称)等字段,我们要实现通过传入一个部门id,查询出它下面的所有子部门记录的功能。

    具体实现

    我们可以通过Mysql函数的递归调用来实现。

    1.创建函数getChildrenOrg。

    CREATE DEFINER=`root`@`%` FUNCTION `getChildrenOrg`(parentId VARCHAR(36)) RETURNS varchar(4000) CHARSET utf8

    BEGIN

    DECLARE oTemp VARCHAR(4000);

    DECLARE oTempChild VARCHAR(4000);

    SET oTemp = '';

    SET oTempChild = parentId;

    WHILE oTempChild IS NOT NULL

    DO

    SET oTemp = CONCAT(oTemp,',',oTempChild);

    SELECT GROUP_CONCAT(org_id) INTO oTempChild FROM sec_org WHERE FIND_IN_SET(parent_org_id,oTempChild) > 0;

    END WHILE;

    RETURN oTemp;

    END

    如上代码所示,该函数传入一个部门id,返回多条子部门记录。

    需要说明一下几个函数:

    group_concat(colName)

    colName 字段名

    该函数返回带有来自一个组的连接的非NULL值的字符串结果。

    通俗来说就是把分组后的数据,将每组的某个字段的一群记录值用字符串拼接起来,它们之间以逗号隔开,类似于“A,B,C...”这种形式。

    find_in_set(str,strList)

    str 要查询的字符串

    strList 字段名,参数以“,”分隔,如(1,2,3,4)

    该函数会查询字段(strList)中包含的结果,返回结果null或记录。

    2.创建好了函数以后,我们就可以编写SQL语句来调用这个函数了。

    SELECT * FROM sec_org WHERE FIND_IN_SET(org_id,getChildrenOrg('dcb40273'))

    执行以上语句,我们就可以查询出一组部门记录,这组记录即为部门id为“dcb40273”下面的所有子部门的记录。

    展开全文
  • 多级数据-Mysql 中的递归层次查询(父子查询)最近遇到了一个问题,在mysql 中如何完成节点下的所有节点或节点上的所有父节点的查询?在Oracle 中我们知道有一个Hierarchical Queries 可以通过CONNECT BY 来查询,但是...

    多级数据-Mysql 中的递归层次查询(父子查询)

    最近遇到了一个问题,在mysql 中如何完成节点下的所有节点或节点上的所有父节点的查询?

    在Oracle 中我们知道有一个Hierarchical Queries 可以通过CONNECT BY 来查询,但是,在MySQL 中还没有对应的函数!!! 下面给出一个function 来完成的方法

    下面是sql 脚本,想要运行的直接赋值粘贴进数据库即可。

    创建表treenodes (可以根据需要进行更改)

    1 2 3 4 5 6 7 8 9 10 -- ----------------------------

    -- Table structure for `treenodes`

    -- ----------------------------

    DROP TABLE IF EXISTS `treenodes`;

    CREATE TABLE `treenodes` (

    `id` int (11) NOT NULL ,

    `nodename` varchar (20) DEFAULT NULL ,

    `pid` int (11) DEFAULT NULL ,

    PRIMARY KEY (`id`)

    ) ENGINE =InnoDB DEFAULT CHARSET =latin1;

    插入几条数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -- ----------------------------

    -- Records of treenodes

    -- ----------------------------

    INSERT INTO `treenodes` VALUES ('1', 'A', '0');

    INSERT INTO `treenodes` VALUES ('2', 'B', '1');

    INSERT INTO `treenodes` VALUES ('3', 'C', '1');

    INSERT INTO `treenodes` VALUES ('4', 'D', '2');

    INSERT INTO `treenodes` VALUES ('5', 'E', '2');

    INSERT INTO `treenodes` VALUES ('6', 'F', '3');

    INSERT INTO `treenodes` VALUES ('7', 'G', '6');

    INSERT INTO `treenodes` VALUES ('8', 'H', '0');

    INSERT INTO `treenodes` VALUES ('9', 'I', '8');

    INSERT INTO `treenodes` VALUES ('10', 'J', '8');

    INSERT INTO `treenodes` VALUES ('11', 'K', '8');

    INSERT INTO `treenodes` VALUES ('12', 'L', '9');

    INSERT INTO `treenodes` VALUES ('13', 'M', '9');

    INSERT INTO `treenodes` VALUES ('14', 'N', '12');

    INSERT INTO `treenodes` VALUES ('15', 'O', '12');

    INSERT INTO `treenodes` VALUES ('16', 'P', '15');

    INSERT INTO `treenodes` VALUES ('17', 'Q', '15');

    把下面的语句直接粘贴进命令行执行即可(注意修改传入的参数,默认rootId ,表明默认treenodes )

    展开全文
  • 欅坂46前言最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询?在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在MySQL中还没有对应的函数!!!创建...

    84c8abc3c0cf?from=singlemessage

    欅坂46

    前言

    最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询?

    在Oracle中我们知道有一个Hierarchical Queries可以通过CONNECT BY来查询,但是,在MySQL中还没有对应的函数!!!

    创建数据表

    下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。

    CREATE TABLE `treenodes` (

    `id` int(11) NOT NULL,

    `nodename` varchar(20) DEFAULT NULL,

    `pid` int(11) DEFAULT NULL,

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    插入几条数据

    INSERT INTO `treenodes` VALUES ('1', 'A', '0');

    INSERT INTO `treenodes` VALUES ('2', 'B', '1');

    INSERT INTO `treenodes` VALUES ('3', 'C', '1');

    INSERT INTO `treenodes` VALUES ('4', 'D', '2');

    INSERT INTO `treenodes` VALUES ('5', 'E', '2');

    INSERT INTO `treenodes` VALUES ('6', 'F', '3');

    INSERT INTO `treenodes` VALUES ('7', 'G', '6');

    INSERT INTO `treenodes` VALUES ('8', 'H', '0');

    INSERT INTO `treenodes` VALUES ('9', 'I', '8');

    INSERT INTO `treenodes` VALUES ('10', 'J', '8');

    INSERT INTO `treenodes` VALUES ('11', 'K', '8');

    INSERT INTO `treenodes` VALUES ('12', 'L', '9');

    INSERT INTO `treenodes` VALUES ('13', 'M', '9');

    INSERT INTO `treenodes` VALUES ('14', 'N', '12');

    INSERT INTO `treenodes` VALUES ('15', 'O', '12');

    INSERT INTO `treenodes` VALUES ('16', 'P', '15');

    INSERT INTO `treenodes` VALUES ('17', 'Q', '15');

    创建函数

    根据传入id查询所有父节点的id

    CREATE FUNCTION `getParLst`(rootId INT)

    RETURNS varchar(1000)

    BEGIN

    DECLARE sTemp VARCHAR(1000);

    DECLARE sTempPar VARCHAR(1000);

    SET sTemp = '';

    SET sTempPar =rootId;

    #循环递归

    WHILE sTempPar is not null DO

    #判断是否是第一个,不加的话第一个会为空

    IF sTemp != '' THEN

    SET sTemp = concat(sTemp,',',sTempPar);

    ELSE

    SET sTemp = sTempPar;

    END IF;

    SET sTemp = concat(sTemp,',',sTempPar);

    SELECT group_concat(pid) INTO sTempPar FROM treenodes where pid<>id and FIND_IN_SET(id,sTempPar)>0;

    END WHILE;

    RETURN sTemp;

    END

    执行命令

    select * from treenodes where FIND_IN_SET(id,getParList(15));

    84c8abc3c0cf?from=singlemessage

    结果

    根据传入id查询所有子节点的id

    CREATE FUNCTION `getParLst`(rootId INT)

    RETURNS varchar(1000)

    BEGIN

    DECLARE sTemp VARCHAR(1000);

    DECLARE sTempChd VARCHAR(1000);

    SET sTemp = '$';

    SET sTempChd =cast(rootId as CHAR);

    WHILE sTempChd is not null DO

    SET sTemp = concat(sTemp,',',sTempChd);

    SELECT group_concat(id) INTO sTempChd FROM treeNodes where FIND_IN_SET(pid,sTempChd)>0;

    END WHILE;

    RETURN sTemp;

    END

    执行命令

    select * from treenodes where FIND_IN_SET(id,getChildList(7));

    84c8abc3c0cf?from=singlemessage

    结果

    注意

    如果返回数据量过多的话,设置的'varchar(1000)'是不够的,将返回类型改为 'mediumtext' 即可.

    展开全文
  • 日常生活中有很多类似嵌套查询的例子,举个有趣而且比较好理解的例子,比如我想要采访一个父亲,但是要求他的儿子有三个头六个胳膊。假如我们把我们所有人及其儿女的信息都录入到ES中。那么查询出来的结果一定只有一...

    引子

    日常生活中有很多类似嵌套查询的例子,举个有趣而且比较好理解的例子,比如我想要采访一个父亲,但是要求他的儿子有三个头六个胳膊。假如我们把我们所有人及其儿女的信息都录入到ES中。那么查询出来的结果一定只有一个,那就是托塔天王,李靖。

    Has child query

    只会返回匹配孩子的查询条件的父文档,子文档不返回,比如引子里面的例子,那么只会返回托塔天王,李靖。
    您可以在同一索引中使用连接字段的映射来创建文档之间的父子关系。

    因为要执行join父子关系,has_child查询相对于一般的其他查询要缓慢一些。

    其性能随着子文档的数量增多而下降。

    每个has_child查询搜索可以显著增加查询时间。

    如果你关心查询性能,不要使用这个查询。如果你需要使用has_child查询,尽可能很少使用它。

    使用案例

    建立映射关系

    使用has_child查询、索引必须包括一个

    展开全文
  • nested检索, 父子查询

    2021-11-07 19:47:44
    } 父子查询 public abstract class JoinQueryBuilders { /** * Constructs a new has_child query, with the child type and the query to run on the child documents. The * results of this query are the ...
  • ES 父子文档查询

    千次阅读 2021-02-01 03:05:32
    标签:父子文档的特点1. 父/子文档是完全独立的。2. 父文档更新不会影响子文档。3. 子文档更新不会影响父文档或者其它子文档。父子文档的映射与索引1. 父子关系 type 的建立必须在索引新建或 update-mapping 时候...
  • 父子关系-SQL查询

    2021-04-20 05:50:47
    假设只有4个级别,并且您总是希望从级别4开始,下面是查询select L4.OSPID as L4OSPID, L4.OSPNAME as L4OPSNAME,L4.RELATEDOSPIDas L3RELATEDID,caseWHEN L3.OSPNAME = 'LEVEL3' THEN L3.OSPNAMEELSE NULLend as L3...
  • MySql 8 实现递归查询父子集背景...后来百度 mysql 的父子查询也都是存储过程,但是项目不允许使用存储过程,不利于后续维护。最后终于发现了一篇文章有讲到 mysql 自带的函数WITH RECURSIVE实现父子集查询ps:WIT...
  • SQL父子查询

    2021-01-26 10:43:44
    本文的SQL语句适用于具有如下类似结构来记录父子集关系的数据表。以部门表(hr_department)为例进行SQL查询。 TABLE_NAME(id, parent_id) id name parent_id 1 顶级部门 NULL 2 一层部门 1 3 二层部门...
  • 使用 STARTWITH CONNECT BY 语句实现树状查询 使用 SYS_CONNECT_BY_PATH 函数,获取节点的全路径. COLUMN "FullPath" 2:查询语句 SELECT LEVEL, test_id, test_val, SYS_CONNECT_BY_PATH(test_val, '\') AS ...
  • es父子条件查询语句

    2021-12-10 10:34:46
    DELETE my_blogs # 设定 Parent/Child Mapping PUT my_blogs { "settings": { "number_of_shards": 2 }, "mappings": { "properties": { "blog_comments_relation": { "type": "join", ...
  • mysql查询父子

    2021-07-14 15:04:47
    查询父级数据 SELECT ab.pId FROM ( SELECT @r AS _id, (SELECT @r := pId FROM area WHERE id = _id) AS pId FROM (SELECT @r := '7')vars,area a WHERE @r is not null ) ab where pId is not null 查询id...
  • 无限级分类(父子)是一种比较常用的表设计,每种设计方式突出优势的同时也带来缺陷,如:方法1:表设计中只有 parent_id 字段,困扰:查询麻烦(本文可解决);方法2:表设计中冗余子级id便于查询,困扰:添加/更新/...
  • 在Oracle中,能够通过语法轻松实现父子级间的递归查询,无论到父,子,孙,曾孙等多少级,都能查出来。但是在mysql中,就没有像Oracle中那样有现成的语法直接调用了。本篇文章里,我将带大家了解一种在sql中设置参数...
  • 前言 单表存储上下级关系,使用mysql 内置函数循环递归查出来 相关语法函数介绍 @ ...查询字段(strlist)中包含(str)的结果,返回结果为null或记录 具体实现 创建表 CREATE TABLE `rela...
  • parent-child 关系关联关系,可以为两个完全分开的文档,...子文档可以被当做查询请求的结果返回Elasticsearch 维护了一个父文档和子文档的映射关系,得益于这个映射,父-子文档关联查询操作非常快。但是这个映射也对...
  • 递归查询具有父子关系的表

    千次阅读 2021-01-28 04:18:48
    案例描述:一张表(r),有字段m,p , 其中字段m的值可以出现在字段p中,字段p的值也可以出现在m中,根据指定字段p的值,查询字段m的值集,然后将字段m的值集作为字段p的值进行递归查询,直到结果集大小为0。...
  • 有点像es父子关系,但是没有它就实现了。子文档需要使用名为“我的父ID”的字段进行索引,值为父ID。可以在查询父项时使用,预先知道父项的ID,以便在同一查询中获取子项。具有准连接的查询(假设123是父ID):GET /my-...
  • --级联查询返回模型--> <resultMap type="Map" id="fatherMap"> <id column="id" property="id"/> <collection property="list" ofType=...
  • ElasticSearch 系列文章父子结构 父亲type属性查询子type 的类型父子结构的查询,可以通过父亲类型的字段,查询出子类型的索引信息POST /product/_search{"query": {"has_parent": {"parent_type": "base","query": ...
  • } } 小结 按照查询进行嵌套处理就像SQL中的子查询 按照结果进行嵌套处理就像SQL中的联表查询 一对多处理 一对多的处理 一对多的理解: 一个老师拥有多个学生 如果对于老师这边,就是一个一对多的现象,即从一个老师...
  • 前言:最近面试的时候遇到公司要求只能用SQL来查询无限极的数据,不能用PHP程序做递归查询,现在分享方法。下面给出一个function来完成的方法下面是sql脚本,想要运行的直接赋值粘贴进数据库即可。-- --------------...
  • 在《Elasticsearch 父子关系维护和检索案例分享》一文中介绍了Elasticsearch 父子关系维护和检索的基本功能,本文接着上篇文档,分享同时返回父子数据Elasticsearch 关联查询案例。本案例针对elasticsearch 5.x,...
  • mysql数据库表person_organization中,主键是organization_id,另有一列parent_organization_id指向父机构的数据记录;通过以下sql可以取出指定organization_id所在的树状结构枝干上所有的organization_id: ...
  • PostgreSQL 递归查询 (转) 数据库中的数据存在父子关系(单继承,每一条记录只有一个父亲). 如果要查询一条记录以及他的所有子记录,或者要查询一条记录以及他的所有父记录.那么递归查询就再合适不过了.可以简化复杂...
  • SELECT @parentIds, @lev:=@lev+1, (select @parentIds:= group_concat(id) from table_name where find_in_set(parent_id,@parentIds)) FROM table_name, (select @parentIds:=40,@lev:=0) b ...
  • oracle 父子节点 查询

    2021-05-01 04:32:28
    oracle 父子节点 查询1)从父节点到所有子节点SELECT t.ID id,RPAD( '- ', 8*(LEVEL-1), ' -' ) || l.MEANING name,t.MENU_BAR_ID menuBraId,t.PARENT_ID parentId,t.DISPLAY_ORDER displayOrder,CONNECT_BY_ROOT ...
  • if(CollectionUtils.isEmpty(entities)){ log.error("查询全部分类失败{}",entities); return null; } //组装成父子的树形结构 //先查出一级分类 //使用stream流的时候千万不要管整体的,管一个就行了,最后用一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,171
精华内容 15,268
关键字:

父子查询