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官方文档。