SELECT t3.*
FROM (
SELECT t1.*, IF ( FIND_IN_SET( parentid, @pids ) > 0, @pids := CONCAT( @pids, ',', dictionary_id ), '0' ) AS is_child
FROM dictionary AS t1,
( SELECT @pids := #{parentId} ) AS t2
ORDER BY t1.dictionary_id ASC
WHERE t3.is_child != '0' and t3.deleted = 0
然后,使用 UNION ALL 将这个记录和其下级记录合并起来,一直递归下去,直到找到所有下级记录。在上面的语句中,使用了两个
子
查询
,第一个
子
查询
获取 ID 为 1 的记录,第二个
子
查询
获取 ID 为 1 的记录以及其下级记录。在实际使用时,需要将语句中的 items 替换成实际的表名,将 id、pid、name 替换成实际的字段名,将 1 替换成要
查询
的 ID。在实际使用时,需要将语句中的 items 替换成实际的表名,将 id、pid、name 替换成实际的字段名,将 1 替换成要
查询
的 ID。
DROP TABLE IF EXISTS `tblorg`;
CREATE TABLE `tblorg` (
`orgId` varchar(50) NOT NULL, #数据ID
`parentOrgI...
SELECT
@ids AS _ids,
( SELECT @ids := GROUP_CONCAT( pid ) FROM project_grouping WHERE FIND_IN_SET( parent_id, @ids ) ) AS cids,
@l := @l + 1 AS LEVEL1
如果当前节点左
子
节点(cur.left)非空,找到当前节点左
子
树的最右节点(mostRight):
1)如果该节点的右
子
节点(mostRight.right)为空,则将其指针指向当前节点(cur),进入左
子
节点(cur.left)。
2)如果该节点的右
子
节点(mostRight.right)非空,则将其指针置为空,输出当前节点(cur),进入右
子
节点(cur.right)。
SELECT * FROM table_name WHERE Id=‘4’ --表的主键ID
UNION ALL
SELECT T0.* FROM TEMP,table_name T0 WHERE TEMP.Id=T0.ParentId --
子
级ID==父级ID
SELECT * FROM TEMP;
–根据指定节点ID获取所有父节点–
WITH TEMP AS
SELECT * FROM table_name WHERE Id=‘3
现有一个树状的层级
结构
,每一个实体都持有一个父节点的信息,在这里姑且认为持有父节点的id。
生成表的语句为:
create table test (id int primary key auto_increment, name varchar(10), pid int);
有以下几种解决方案:
一、层数不多的情况下,可以采用left join的方式。以总共四层,寻找二级节点以下节点为例:
CREATE DEFINER=`root`@`%` FUNCTION `getParLst`(rootId INT) RETURNS varchar(1000) CHARSET utf8
READS
SQL
DATA
BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempChd VARCHAR(1000);
SET sTemp = '$';
SET sTempChd =cast(rootId as CHAR);