Java Php Mysql 递归查询 查询当前节点下的所有子节点 包含当前节点返回列表
创始人
2024-06-03 15:52:45
0

递归查询

  • MySQL
    • 1. WITH RECURSIVE语法
    • 2. 子查询
    • 3. 函数
  • JAVA代码
    • 执行多次SQL
    • 执行一次SQL
  • PHP代码

MySQL

1. WITH RECURSIVE语法

使用了MySQL的WITH RECURSIVE语法。首先,它选取了当前节点作为起点,然后在递归的过程中找到了所有它的子节点。最后,它输出了所有找到的节点的标识符。
请注意将查询中的[当前节点的ID]替换为你要查询的节点的ID。

WITH RECURSIVE cte AS (SELECT id, parent_idFROM tree_tableWHERE id = [当前节点的ID]UNION ALLSELECT t.id, t.parent_idFROM tree_table tINNER JOIN cte ON t.parent_id = cte.id
)
SELECT id FROM cte;

2. 子查询

如果你使用的MySQL版本不支持WITH RECURSIVE语法,或者你想尝试不使用WITH RECURSIVE的方法;
这个查询使用了两个子查询。第一个子查询选取了当前节点的ID,并且作为递归查询的起点。第二个子查询从tree_table表中自联结,以查找当前节点的所有子节点。然后,使用JOIN操作将这些子节点与tree_table表中的原始记录匹配,从而得到当前节点下的所有子节点。
请注意将查询中的[当前节点的ID]替换为你要查询的节点的ID。

SELECT t1.id
FROM tree_table t1
JOIN (SELECT id FROM tree_table WHERE id = [当前节点的ID]UNION ALLSELECT t2.id FROM tree_table t2 JOIN tree_table t3 ON t2.parent_id = t3.idWHERE t3.id = [当前节点的ID]
) t4
ON t1.id = t4.id;

3. 函数

编写一个存储过程或函数来实现递归查询;将查询中的[当前节点的ID]替换为你要查询的节点的ID。

DELIMITER $$CREATE FUNCTION get_all_children (node_id INT) RETURNS TEXT
BEGINDECLARE child_ids TEXT DEFAULT '';DECLARE child_id INT;SELECT GROUP_CONCAT(id) INTO child_ids FROM tree_table WHERE parent_id = node_id;IF child_ids IS NOT NULL THENSET child_ids = CONCAT(child_ids, ',', get_all_children(child_id));END IF;RETURN child_ids;
END$$DELIMITER ;

这个函数使用递归的方式来查询当前节点下的所有子节点。首先,它查找所有直接子节点的ID,并使用GROUP_CONCAT函数将这些ID连接成一个逗号分隔的字符串。然后,对于每个子节点,函数递归调用自己来查找它的子节点,并将它们的ID也连接到返回值中。最后,函数返回一个包含当前节点下所有子节点ID的逗号分隔字符串。

请注意将函数中的tree_table和id和parent_id字段名称替换为你实际使用的表和字段名称。你可以使用以下语句来调用这个函数:

SELECT get_all_children([当前节点的ID]);

将查询中的[当前节点的ID]替换为你要查询的节点的ID。

JAVA代码

执行多次SQL

这个Java方法使用递归的方式来查询当前节点下的所有子节点。首先,它查询所有直接子节点的ID。然后,对于每个子节点,方法递归调用自己来查找它的子节点。最后,方法返回一个包含当前节点下所有子节点ID的列表。

请注意将示例代码中的tree_table和id和parent_id字段名称替换为你实际使用的表和字段名称,以及将数据库连接的URL、用户名和密码替换为你的实际连接信息。

import java.sql.*;
import java.util.ArrayList;
import java.util.List;public class TreeUtils {public static List getAllChildren(int nodeId, Connection conn) throws SQLException {List childIds = new ArrayList<>();// 查询所有直接子节点PreparedStatement stmt = conn.prepareStatement("SELECT id FROM tree_table WHERE parent_id = ?");stmt.setInt(1, nodeId);ResultSet rs = stmt.executeQuery();// 对于每个子节点,递归调用自己来查找它的子节点while (rs.next()) {int childId = rs.getInt("id");childIds.add(childId);childIds.addAll(getAllChildren(childId, conn));}rs.close();stmt.close();return childIds;}// 使用示例public static void main(String[] args) {Connection conn = null;try {// 创建数据库连接conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "root", "password");// 查询当前节点的所有子节点List childIds = getAllChildren([当前节点的ID], conn);// 输出所有子节点的IDSystem.out.println(childIds);} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

执行一次SQL

这个Java方法首先执行SQL语句查询所有节点,然后将结果集转换为列表。接着使用递归的方式来查询树结构。它遍历列表中的每个节点,如果节点的父ID等于指定的父ID,则将该节点作为当前节点,递归查询该节点的子节点,并将子节点作为嵌套的子树添加到当前节点。最后,方法返回一个包含根节点的树结构的Map对象。

请注意将示例代码中的tree_table和id和parent_id字段名称替换为你实际使用的表和字段名称,以及将数据库连接的URL、用户名和密码

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class TreeUtils {public static Map buildTree(List> list, int parentId) {Map node = new HashMap<>();for (Map item : list) {int id = (int) item.get("id");int pid = (int) item.get("parent_id");if (pid == parentId) {// 设置当前节点的属性node.put("id", id);node.put("name", item.get("name"));// 递归查询当前节点的子节点List> children = new ArrayList<>();for (Map child : list) {int childPid = (int) child.get("parent_id");if (childPid == id) {children.add(buildTree(list, id));}}// 如果有子节点,则将子节点添加到当前节点if (!children.isEmpty()) {node.put("children", children);}}}return node;}// 使用示例public static void main(String[] args) {Connection conn = null;try {// 创建数据库连接conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "root", "password");// 执行SQL语句查询所有节点PreparedStatement stmt = conn.prepareStatement("SELECT * FROM tree_table");ResultSet rs = stmt.executeQuery();// 将结果集转换为列表List> list = new ArrayList<>();while (rs.next()) {Map item = new HashMap<>();item.put("id", rs.getInt("id"));item.put("name", rs.getString("name"));item.put("parent_id", rs.getInt("parent_id"));list.add(item);}// 构建树结构Map tree = buildTree(list, 0);// 输出树结构System.out.println(tree);rs.close();stmt.close();} catch (SQLException e) {e.printStackTrace();} finally {try {if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}}
}

PHP代码

这个PHP函数使用递归的方式来查询当前节点下的所有子节点。首先,它查询所有直接子节点的ID。然后,对于每个子节点,函数递归调用自己来查找它的子节点。最后,函数返回一个包含当前节点下所有子节点ID的数组。

请注意将示例代码中的tree_table和id和parent_id字段名称替换为你实际使用的表和字段名称。如果你使用的是其他语言或框架,可以根据类似的逻辑编写递归函数或方法来实现递归查询。

function get_all_children($node_id, $mysqli) {$child_ids = array();// 查询所有直接子节点$result = $mysqli->query("SELECT id FROM tree_table WHERE parent_id = $node_id");// 对于每个子节点,递归调用自己来查找它的子节点while ($row = $result->fetch_assoc()) {$child_id = $row['id'];$child_ids[] = $child_id;$child_ids = array_merge($child_ids, get_all_children($child_id, $mysqli));}return $child_ids;
}// 使用示例
$mysqli = new mysqli('host', 'username', 'password', 'database');
$node_id = 1; // 替换为你要查询的节点的ID
$child_ids = get_all_children($node_id, $mysqli);
print_r($child_ids);

相关内容

热门资讯

哥伦比亚 从“向北看”到“看世... 转自:央视新闻客户端  哥伦比亚总统佩特罗5月12日刚刚抵达北京,13日他就带着女儿直奔长城。而且还...
天仪研究院完成第20次太空任务... 来源:中国新闻网中新网长沙5月17日电 (刘曼 陈红微)北京时间5月17日12时12分,由长沙天仪空...
北路梆子《班婕妤》剧本座谈会在... 5月15日,由中国艺术研究院与山西省忻州市文化和旅游局合作打造的新创历史故事剧《班婕妤》剧本座谈会在...
潘展乐夺得2025年全国游泳冠... 转自:澎湃新闻10岁的潘展乐接受采访画面。十年前,稚气未脱的潘展乐在镜头前喊出那句“比孙杨快就够了”...
华泰证券:看好海外燃气轮机主机... 经济观察网讯 华泰证券研报称,根据McCoy统计,2025年一季度全球燃气轮机新增订单同比增长36%...
一场凉亭座谈会 | 学习总书记... 2022年4月11日,习近平在海南省五指山市水满乡毛纳村,同当地干部群众亲切交谈。新华社记者 李学仁...
【甘快看】榜样如炬 追光前行—... “感动甘肃·陇人骄子”发布活动现场。新甘肃·甘肃日报记者 冯乐凯感动是一缕阳光,感动是一种力量。5月...
保障粮食生产灌溉用水 全国春灌... 记者从水利部了解到,截至5月中旬,今年全国平均降水量较常年同期偏少近两成,主要江河来水量较常年同期偏...
特朗普:泽连斯基是“全球最佳推... 特朗普称泽连斯基是“全球最佳推销员”,质疑援乌资金去向。据央视新闻,美国总统特朗普当地时间5月16日...
牲畜病了?去“家门口的兽医院” 转自:草原云“‘家门口的兽医院’特别方便,家里牛羊生病,打个电话工作人员就及时上门救助了。”5月17...
胖东来:接受任何核查,造谣诽谤... 5月16日,胖东来发布《关于网络发布“质疑胖东来经营管理、商品采购渠道、定价标准、财税信息”的回复说...
【甘快看】 榜样如炬 追光前行... “感动甘肃·陇人骄子”发布活动现场。新甘肃·甘肃日报记者 冯乐凯新甘肃·甘肃日报记者 石丹丹感动是一...
玉礼东方 多元一体 跟着总书记... 时针拨回到5000多年前,中国太湖流域的先人用自己的智慧与勤劳构筑起一个充满浪漫与梦想的国度——良渚...
签完购房合同,房子就属于你吗? 转自:法治日报现款支付,手持房屋买卖合同,房子可能依然“不属于你”?近日,河南省渑池县人民法院就审结...
精准服务,贴心相伴!苏州金龙入... 转自:衡水日报 5月以来,全国各地陆续开启“入夏”模式,苏州金龙也于近日推出入夏服务“特供礼包”,为...
生理期请病假被要求脱裤子证明?... 5月15日,有网友发布视频称,北京工业大学耿丹学院一名女生在生理期不舒服时前往医务室请病假,被要求脱...
北斗技术“出海”加速! 中国丝... 转自:衡水日报 2025年5月15日,马来西亚太空科技协会(SMA)与中国卫星导航定位协会(GLAC...
第五届中国(北京)广电媒体融合... 中新网北京5月17日电 (记者 高凯)由中国广播电视社会组织联合会、中共北京市委宣传部、北京市广电局...
RTX 5060系显卡和笔记本... 来源:环球网 备受广大消费者关注的RTX 5060显卡目前已在京东心动购物季抢先开启预约,并将于5月...
藏玉的名字,藏着一份岁月的温柔   “国无玉不胜,家无玉不富,人无玉不贵,山有玉而草木润,人藏玉而万事兴。”  当我们在无数次思考品...