根據用戶ID獲取所有子節點數據或是上級直屬節點數據

一、根據用戶ID獲取所有子節點,通過存儲過程來實現

CREATE DEFINER=`crmeb`@`%` PROCEDURE `proc_get_user_all_children`(
? ? IN rootUid INTEGER, ? ? ? ? ? ? ?-- 要查詢的根用戶ID
? ? IN includeSelf BOOLEAN ? ? ?-- 是否包含自身(1=包含,0=不包含)
)
BEGIN

? ??
? ? -- 聲明變量?
? ? DECLARE current_level INT DEFAULT 0;
? ??
? ? -- 創建臨時表存儲最終結果
? ? DROP TEMPORARY TABLE IF EXISTS final_result;
? ? CREATE TEMPORARY TABLE final_result (
? ? ? ? id INT PRIMARY KEY,
? ? ? ? level INT COMMENT '層級深度',
? ? ? ? spread_uid INT COMMENT '直接上級ID'
? ? ) ENGINE=InnoDB;
? ??
? ? -- 創建臨時表存儲當前層級的用戶?
? ? DROP TEMPORARY TABLE IF EXISTS current_level_users;
? ? CREATE TEMPORARY TABLE current_level_users (
? ? ? ? id INT PRIMARY KEY
? ? ) ENGINE=Memory;
? ??
? ? -- 創建臨時表存儲下一層級的用戶?
? ? DROP TEMPORARY TABLE IF EXISTS next_level_users;
? ? CREATE TEMPORARY TABLE next_level_users (
? ? ? ? id INT PRIMARY KEY,
? ? ? ? spread_uid INT
? ? ) ENGINE=Memory;
? ??
? ? -- 初始化:添加根節點(如果選擇包含自身)
? ? IF includeSelf THEN
? ? ? ? INSERT INTO final_result?
? ? ? ? SELECT id, 0, spread_uid?
? ? ? ? FROM eb_user?
? ? ? ? WHERE id = rootUid;
? ? END IF;
? ??
? ? -- 初始化當前層級(根節點的直接下級)
? ? INSERT INTO current_level_users
? ? SELECT id?
? ? FROM eb_user?
? ? WHERE spread_uid = rootUid AND id != IF(includeSelf, -1, rootUid);
? ??
? ? -- 將直接下級加入結果集?
? ? INSERT INTO final_result?
? ? SELECT u.id, ?1, u.spread_uid?
? ? FROM eb_user u
? ? WHERE u.spread_uid ?= rootUid AND u.id ?!= IF(includeSelf, -1, rootUid);
? ??
? ? -- 循環處理每一層級(廣度優先遍歷)
? ? WHILE EXISTS (SELECT 1 FROM current_level_users) DO
? ? ? ? SET current_level = current_level + 1;
? ? ? ??
? ? ? ? -- 清空下一層級臨時表
? ? ? ? TRUNCATE TABLE next_level_users;
? ? ? ??
? ? ? ? -- 查找當前層級用戶的直接下級
? ? ? ? INSERT INTO next_level_users?
? ? ? ? SELECT u.id, ?u.spread_uid ?
? ? ? ? FROM eb_user u?
? ? ? ? JOIN current_level_users c ON u.spread_uid ?= c.id?
? ? ? ? WHERE u.id ?NOT IN (SELECT id FROM final_result);
? ? ? ??
? ? ? ? -- 將新找到的子節點添加到結果表?
? ? ? ? INSERT INTO final_result?
? ? ? ? SELECT id, current_level + 1, spread_uid?
? ? ? ? FROM next_level_users;
? ? ? ??
? ? ? ? -- 準備處理下一層級
? ? ? ? TRUNCATE TABLE current_level_users;
? ? ? ? INSERT INTO current_level_users
? ? ? ? SELECT id FROM next_level_users;
? ? END WHILE;
? ??
? ? -- 返回最終結果
? ? SELECT?
? ? ? ? r.id,?
? ? ? ? u.real_name, ? ? ? ? ? ? ? -- 假設表中有real_name字段
? ? ? ? r.level,?
? ? ? ? r.spread_uid,?
? ? ? ? p.real_name ?AS parent_name -- 上級用戶名
? ? FROM final_result r
? ? JOIN eb_user u ON r.id ?= u.id?
? ? LEFT JOIN eb_user p ON r.spread_uid ?= p.id ?
? ? ORDER BY r.level, ?r.id;?
? ??
? ? -- 清理臨時表?
? ? DROP TEMPORARY TABLE IF EXISTS final_result;
? ? DROP TEMPORARY TABLE IF EXISTS current_level_users;
? ? DROP TEMPORARY TABLE IF EXISTS next_level_users;
END

測試結果,如下:

二、根據用戶ID獲取用戶所有上級直屬節點,用存儲過程實現,如下:


?
CREATE PROCEDURE sp_get_user_parent_nodes(
? ? IN base_user_id INT, ? ? ? -- 要查詢的基礎用戶ID?
? ? IN include_self BOOLEAN ? ?-- 是否包含自己(1=包含,0=不包含)
)
BEGIN?

? ??
? ? -- 創建臨時結果表(優化結構)
? ? DROP TEMPORARY TABLE IF EXISTS user_parent_nodes;
? ? CREATE TEMPORARY TABLE user_parent_nodes (
? ? ? ? node_level INT NOT NULL COMMENT '節點層級(0=自己,1=直接上級...)',
? ? ? ? user_id INT NOT NULL,
? ? ? ? real_name VARCHAR(100),
? ? ? ? parent_id INT,
? ? ? ? is_root_node BOOLEAN DEFAULT FALSE,
? ? ? ? PRIMARY KEY (user_id),
? ? ? ? KEY idx_level (node_level)
? ? ) ENGINE=InnoDB;
? ??
? ? -- 變量初始化?
? ? SET @current_user := base_user_id;
? ? SET @current_level := 0;
? ? SET @continue := 1;
? ??
? ? -- 如果包含自己,先添加自己?
? ? IF include_self THEN?
? ? ? ? INSERT INTO user_parent_nodes?
? ? ? ? SELECT?
? ? ? ? ? ? 0 AS node_level,
? ? ? ? ? ? id AS user_id,
? ? ? ? ? ? real_name,
? ? ? ? ? ? spread_uid AS parent_id,
? ? ? ? ? ? CASE WHEN spread_uid IS NULL THEN TRUE ELSE FALSE END AS is_root_node?
? ? ? ? FROM eb_user?
? ? ? ? WHERE id = base_user_id;
? ? END IF;
? ??
? ? -- 使用WHILE循環向上追溯?
? ? WHILE @continue = 1 DO?
? ? ? ? -- 獲取當前用戶的直接上級信息?
? ? ? ? INSERT INTO user_parent_nodes?
? ? ? ? SELECT?
? ? ? ? ? ? @current_level + 1 AS node_level,
? ? ? ? ? ? parent.id ?AS user_id,
? ? ? ? ? ? parent.real_name,?
? ? ? ? ? ? parent.spread_uid ?AS parent_id,
? ? ? ? ? ? CASE WHEN parent.spread_uid ?IS NULL THEN TRUE ELSE FALSE END AS is_root_node?
? ? ? ? FROM eb_user current?
? ? ? ? JOIN eb_user parent ON current.spread_uid ?= parent.id ?
? ? ? ? WHERE current.id ?= @current_user?
? ? ? ? ON DUPLICATE KEY UPDATE node_level = LEAST(node_level, @current_level + 1);
? ? ? ??
? ? ? ? -- 檢查是否插入成功?
? ? ? ? IF ROW_COUNT() = 0 THEN?
? ? ? ? ? ? -- 沒有上級,標記當前用戶為根節點(如果是第一次處理)
? ? ? ? ? ? UPDATE user_parent_nodes?
? ? ? ? ? ? SET is_root_node = TRUE?
? ? ? ? ? ? WHERE user_id = @current_user AND is_root_node = FALSE;
? ? ? ? ? ??
? ? ? ? ? ? SET @continue := 0;
? ? ? ? ELSE?
? ? ? ? ? ? -- 獲取新插入的上級ID?
? ? ? ? ? ? SELECT user_id INTO @current_user?
? ? ? ? ? ? FROM user_parent_nodes?
? ? ? ? ? ? WHERE node_level = @current_level + 1?
? ? ? ? ? ? LIMIT 1;
? ? ? ? ? ??
? ? ? ? ? ? -- 檢查是否已存在(防止循環引用)
? ? ? ? ? ? IF @current_user IN (
? ? ? ? ? ? ? ? SELECT user_id FROM user_parent_nodes?
? ? ? ? ? ? ? ? WHERE node_level < @current_level + 1?
? ? ? ? ? ? ) THEN?
? ? ? ? ? ? ? ? SET @continue := 0;
? ? ? ? ? ? END IF;
? ? ? ? ? ??
? ? ? ? ? ? SET @current_level := @current_level + 1;
? ? ? ? END IF;
? ? END WHILE;
? ??
? ? -- 返回最終結果(按層級排序)
? ? SELECT?
? ? ? ? node_level AS '層級',
? ? ? ? user_id AS '用戶ID',
? ? ? ? real_name AS '用戶名',
? ? ? ? CASE?
? ? ? ? ? ? WHEN node_level = 1 THEN '直接上級'
? ? ? ? ? ? WHEN is_root_node THEN '頂級節點'
? ? ? ? ? ? ELSE CONCAT('第', node_level, '級上級')
? ? ? ? END AS '關系類型',
? ? ? ? parent_id AS '下級用戶ID'
? ? FROM user_parent_nodes?
? ? WHERE node_level > 0 OR include_self = 1?
? ? ORDER BY node_level;
? ??
? ? -- 清理臨時表?
? ? DROP TEMPORARY TABLE IF EXISTS user_parent_nodes;
END?

測試結果,如下:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81359.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81359.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81359.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機組成原理——數據的表示

2.1數據的表示 整理自Beokayy_ 1.進制轉換 十六進制與二進制的轉換 一位十六進制等于四位二進制 四位二進制等于一位十六進制 0x173A4C0001 0111 0011 1010 0100 1100 十六進制與十進制的轉換 十六轉十&#xff1a;每一位數字乘以相應的16的冪再相加 十轉十六&#xff1a…

基于MATLAB-GUI圖形界面的數字圖像處理

基于MATLAB GUI的數字圖像處理系統實現方案&#xff0c;包含常見圖像處理功能。代碼分為兩部分&#xff1a;GUI界面設計和回調函數實現。 %% 第一部分&#xff1a;創建GUI界面 (使用GUIDE) % 1. 打開GUIDE: guide % 2. 創建新GUI&#xff0c;添加以下控件&#xff1a; % - …

從裸機開發到實時操作系統:FreeRTOS詳解與實戰指南

從裸機開發到實時操作系統&#xff1a;FreeRTOS詳解與實戰指南 本文將帶你從零開始&#xff0c;深入理解嵌入式系統中的裸機開發與實時操作系統&#xff0c;以FreeRTOS為例&#xff0c;全面剖析其核心概念、工作原理及應用場景。無論你是嵌入式新手還是希望提升技能的開發者&am…

zabbix7.2最新版本 nginx自定義監控(三) 設置觸發器

安裝zabbix-get服務 在zabbix-server端口安裝zabbix-get服務 [rootlocalhost ~]# dnf install -y zabbix-get Last metadata expiration check: 1:55:49 ago on Wed 14 May 2025 09:24:49 AM CST. Dependencies resolved. Package Architectur…

在 Kotlin 中,什么是解構,如何使用?

在 Kotlin 中&#xff0c;解構是一種語法糖&#xff0c;允許將一個對象分解為多個獨立的變量。 這種特性可以讓代碼更簡潔、易讀&#xff0c;尤其適用于處理數據類、集合&#xff08;如 Pair、Map&#xff09;或其他結構化數據。 1 解構的核心概念 解構通過定義 componentN()…

html的鼠標點擊事件有哪些寫法

在HTML中&#xff0c;鼠標點擊事件的實現方式多樣&#xff0c;以下從基礎語法到現代實踐為您詳細梳理&#xff1a; 一、基礎寫法&#xff1a;直接內聯事件屬性 在HTML標簽內通過on前綴事件屬性綁定處理函數&#xff0c;適合簡單交互場景&#xff1a; <!-- 單擊事件 -->…

基于EFISH-SCB-RK3576/SAIL-RK3576的智能垃圾分類站技術方案

&#xff08;國產化替代J1900的環保物聯網解決方案&#xff09; 一、硬件架構設計? ?多模態感知系統? ?高精度識別模塊?&#xff1a; 雙光譜成像&#xff08;RGB近紅外&#xff09;融合NPU加速ResNet50模型&#xff0c;支持40垃圾品類識別&#xff08;準確率>99.5%&am…

PYTHON訓練營DAY27

裝飾器 編寫一個裝飾器 logger&#xff0c;在函數執行前后打印日志信息&#xff08;如函數名、參數、返回值&#xff09; logger def multiply(a, b):return a * bmultiply(2, 3) # 輸出: # 開始執行函數 multiply&#xff0c;參數: (2, 3), {} # 函數 multiply 執行完畢&a…

Android Studio 中 build、assemble、assembleDebug 和 assembleRelease 構建 aar 的區別

上一篇&#xff1a;Tasks中沒有build選項的解決辦法 概述&#xff1a; 在構建 aar 包時通常會在下面的選項中進行構建&#xff0c;但是對于如何構建&#xff0c;選擇哪種方式構建我還是處于懵逼狀態&#xff0c;所以我整理了一下幾種構建方式的區別以及如何選擇。 1. build…

視頻質量分析時,遇到不同分辨率的對照視頻和源視頻,分辨率對齊的正確順序。

背景 我們平時在做視頻轉碼后&#xff0c;會用VMAF/PSNR得評分工具進行視頻對比的評分&#xff0c;但是這幾種客觀評分方式都有一個要求就是分辨率要一模一樣&#xff0c;因為這樣才對像素點做數學運算。 但是分辨率對齊其實有兩種選擇&#xff0c;例如源視頻是1080P&#xf…

【技巧】離線安裝docker鏡像的方法

回到目錄 【技巧】離線安裝docker鏡像的方法 0. 為什么需要離線安裝&#xff1f; 第一、 由于docker hub被墻&#xff0c;所以 拉取鏡像需要配置國內鏡像源 第二、有一些特殊行業服務器無法接入互聯網&#xff0c;需要手工安裝鏡像 1. 可以正常拉取鏡像服務器操作 服務器…

計算機網絡 : 網絡基礎

計算機網絡 &#xff1a; 網絡基礎 目錄 計算機網絡 &#xff1a; 網絡基礎引言1. 網絡發展背景2. 初始協議2.1 初始協議2.2 協議分層2.2.1 軟件分層的好處2.2.2 OSI七層模型2.2.3 TCP/IP五層&#xff08;四層&#xff09;模型 2.3 TCP/IP協議2.3.1TCP/IP協議與操作系統的關系&…

【2025最新】Windows系統裝VSCode搭建C/C++開發環境(附帶所有安裝包)

文章目錄 為什么選擇VSCode作為C/C開發工具&#xff1f;一、VSCode安裝過程&#xff08;超簡單&#xff01;&#xff09;二、VSCode中文界面設置&#xff08;再也不用對著英文發愁&#xff01;&#xff09;三、安裝C/C插件&#xff08;編程必備神器&#xff01;&#xff09;四、…

Jmeter 安裝包與界面漢化

Jmeter 安裝包&#xff1a; 通過網盤分享的文件&#xff1a;CSDN-apache-jmeter-5.5 鏈接: https://pan.baidu.com/s/17gK98NxS19oKmkdRhGepBA?pwd1234 提取碼: 1234 Jmeter界面漢化&#xff1a;

HandlerInterceptor介紹-筆記

1. HandlerInterceptor簡介 org.springframework.web.servlet.HandlerInterceptor 是 Spring MVC 中用于攔截 HTTP 請求的核心接口。 public interface HandlerInterceptor {default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object ha…

C++循環效率比較與優化建議

在 C++ 中,不同循環結構(如 for、while、do-while、基于范圍的 for)在優化后的性能通常是等效的,因為現代編譯器會對它們進行底層優化,生成相似的機器代碼。循環的效率更多取決于循環體內的操作和數據訪問模式,而非循環結構本身的選擇。以下是關鍵點總結: 1. 傳統循環的…

北京孫河傲云源墅:限量典藏的主城墅居臻品

在限墅令的背景下&#xff0c;北京主城的墅居產品日益稀缺&#xff0c;而傲云源墅作為孫河墅區的杰出之作&#xff0c;憑借其獨特的價值&#xff0c;成為了眾多高端置業者的理想選擇。 傲云源墅所處的孫河地區&#xff0c;是北京公認的高價值板塊。其地位在 2025 年孫河 2902 …

簡單入門RabbitMQ

本章將帶大家來寫一個簡單的程序&#xff0c;使用 Java 創建RabbitMQ 的生產者和消費者 依賴引入 在 Maven 倉庫中輸入 amqp-client&#xff1a; 找到第一個 RabbitMQ Java Client &#xff0c;點擊進去找到一個合適的版本然后將依賴引入到我們項目中的 pom.xml 文件中。 …

Git基礎使用方法與命令總結

Git 是一個分布式版本控制系統&#xff0c;用于跟蹤代碼或文件的修改歷史。以下是 Git 的基礎使用方法和常用命令&#xff0c;適合快速上手&#xff1a; 1. 安裝與配置 安裝 Git 下載地址&#xff1a;https://git-scm.com/downloads&#xff08;支持 Windows/macOS/Linux&…

Oracle SYSTEM/UNDO表空間損壞的處理思路

Oracle SYSTEM/UNDO表空間損壞是比較棘手的故障&#xff0c;通常會導致數據庫異常宕機進而無法打開數據庫。數據庫的打開故障處理起來相對比較麻煩&#xff0c;讀者可以參考本書第5章進一步了解該類故障的處理過程。如果數據庫沒有備份&#xff0c;通常需要設置官方不推薦的隱含…