mysql 根据父节点id获取父节点和所有子节点

ostools 2017-11-15 05:21:47
mysql 根据父节点id获取父节点和所有子节点



传入id为1 获取数据库中宝鸡市下所有的县镇村

用的mysql和mybatis
...全文
2008 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ITVin 2017-12-01
  • 打赏
  • 举报
回复 1
上面是创建一个存储过程。 下面才是查询
SELECT * FROM digui WHERE FIND_IN_SET(id,diguihanshu(1));
ITVin 2017-12-01
  • 打赏
  • 举报
回复
DROP FUNCTION IF EXISTS diguihanshu;
CREATE FUNCTION diguihanshu(areaId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sid VARCHAR(4000);
DECLARE sidChd VARCHAR(4000);

SET sid='$';
SET sidChd = CAST(areaId AS CHAR);

WHILE sidChd IS NOT NULL DO
SET sid= CONCAT(sid,',',sidChd);
SELECT GROUP_CONCAT(id) INTO sidChd FROM digui WHERE FIND_IN_SET(pid,sidChd)>0;
END WHILE;
RETURN sid;
END;

SELECT * FROM digui WHERE FIND_IN_SET(id,diguihanshu(6));
ostools 2017-11-29
  • 打赏
  • 举报
回复
ostools 2017-11-17
  • 打赏
  • 举报
回复
kampoo 2017-11-16
  • 打赏
  • 举报
回复
或者在编码上想办法,比如类似邮政编码,编码是分级的,518000是518XXX的根节点~~ 分级编码查询效率会高很多,但更新修改复杂。要否采用看你的编码体系是不是稳定,要不要经常变。
kampoo 2017-11-16
  • 打赏
  • 举报
回复
查询数据结构的遍历算法,使用一个递归或者堆栈来操作,简单来说: 一个栈存放中间过程中的节点,一个栈存放结果节点。 把根节点的直接子节点入栈1; 从栈1取出一个节点,放入栈2;并查找其子节点全部放入栈1;重复该步骤直到栈1为空。 栈2就是全部的子节点。
zjcxc 2017-11-16
  • 打赏
  • 举报
回复
需要写个函数
ddkking 2017-11-16
  • 打赏
  • 举报
回复
如果表结构可以改的话可以加一列path用来记录路径,例如西关-/0-1-2,统计1的所有子集的话直接path包含0的就是了

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧