MySQL树查询:精准实现你的查询梦想(mysql树查询语句)

MySQL的树状查询是一种用来查询树状结构的查询方法,很多时候我们都遇到这种情况,例如职务体系、渠道结构等模型,非常适合用MySQL 树查询来实现,很多ORM框架也提供有相应的支持!

MySQL 树状查询可以精准实现你的查询梦想,它可以帮助你查询某节点的所有子节点,可以帮助你找到某节点的父节点,也可以帮助你查询某节点的兄弟节点。下面我们来看看如何使用 MySQL 树状查询:

一、查询子节点

首先,用一个关联表来存储节点在树中的层级关系,该关联表中必须有id和parentid,其中parentid用于保存该节点的父节点id,例子如下:

| id | parentid |name |

| — | —| — |

| 1 | 0 | A |

| 2 | 0 | B |

| 3 | 1 | C |

| 4 | 1 | D |

| 5 | 3 | E |

假设我们要查询节点A的所有子节点,可以用下面的SQL语句:

SELECT * FROM tree WHERE FIND_IN_SET(id,getChildList('1'))

其中,getChildList(‘1’)是一个函数,用于将节点A的所有子节点id以字符串形式返回。函数代码如下:

CREATE FUNCTION getChildList (parentid INT)  
RETURNS varchar(255)
BEGIN
DECLARE sTemp VARCHAR (255);
DECLARE sTempChd VARCHAR (255);
SET sTemp = '$';
SET sTempChd =CAST (parentid AS CHAR);
WHILE sTempChd IS NOT NULL
DO
IF sTemp = '$'
THEN
SET sTemp = sTempChd;
ELSE
SET sTemp = CONCAT_WS (',',sTemp,sTempChd);
END IF;
SELECT GROUP_CONCAT(id)
INTO sTempChd
FROM tree
WHERE FIND_IN_SET (parentid,sTempChd)>0
END WHILE;
RETURN sTemp;
END

二、查询父节点

同样的,我们可以通过上面的表来查询某节点的父节点,可以使用如下SQL语句:

SELECT * FROM tree WHERE FIND_IN_SET(parentid, getParentList('5'));

其中,getParentList(‘5’) 是一个自定义函数,它可以返回节点E的所有父节点:

CREATE FUNCTION getParentList (parentid INT)  
RETURNS varchar(255)
BEGIN
DECLARE sTemp VARCHAR (255);
DECLARE sTempPar VARCHAR (255);
SET sTemp = '$';
SET sTempPar =CAST (parentid AS CHAR);
WHILE sTempPar IS NOT NULL
DO
IF sTemp = '$'
THEN
SET sTemp = sTempPar;
ELSE
SET sTemp = CONCAT_WS (',',sTemp,sTempPar);
END IF;
SELECT GROUP_CONCAT(parentid)
INTO sTempPar
FROM tree
WHERE FIND_IN_SET (id,sTempPar)>0
END WHILE;
RETURN sTemp;
END

三、查询兄弟节点

查询某节点的兄弟节点,可以使用如下SQL:

SELECT * FROM tree t
WHERE t.id != 5 AND FIND_IN_SET (t.parentid, getParentList('5'))

以上就是 MySQL 树状查询的基本使用方法。可以看出,MySQL 树状查询可以帮助我们精准实现我们的查询梦想,想要深入了解更多MySQL 树状查询知识,可以参考更多有关资料,比如MySQL官方文档。


数据运维技术 » MySQL树查询:精准实现你的查询梦想(mysql树查询语句)