大概需求就是A邀請了B 和C、C邀請了D、D邀請了E F G,如下圖

現在想通過A查詢出來所有的子節點、包括直接和間接的,現在的sql陳述句 只能通過A查到B C D
select * from
(
SELECT
invitation_code
,invited_code
,@le:= IF (invited_code = '0' ,0,IF( LOCATE( CONCAT('|',invited_code,':'),@pathlevel) > 0 ,SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',invited_code,':'),-1),'|',1) +1,@le+1) ) levels
,@pathlevel:= CONCAT(@pathlevel,'|',invitation_code,':', @le ,'|') pathlevel
,@pathnodes:= IF( invited_code ='0',',0',CONCAT_WS(',',IF( LOCATE( CONCAT('|',invited_code,':'),@pathall) > 0 , SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',invited_code,':'),-1),'|',1),@pathnodes ) ,invited_code ) )paths
,@pathall:=CONCAT(@pathall,'|',invitation_code,':', @pathnodes ,'|') pathall
FROM geek_user_info,
(SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='') vv
ORDER BY invited_code,invitation_code
) src
where LOCATE('NEYSVAQN',paths) > 0 order by invitation_code;
uj5u.com熱心網友回復:
https://blog.csdn.net/nayi_224/article/details/97778698uj5u.com熱心網友回復:
mysql 5.7 可以使用存盤程序實作,給你一個示例http://www.msgde.net/mysql/mysql_recursion_select.html
uj5u.com熱心網友回復:
其實這問題很簡單,首先確認2個問題。1、總共有多少個節點。
2、總共有多少層。
確定完以上2個問題后,需要做以下2件事。
1、首先給你的所有節點編號(新建資料庫表欄位ID,此編號存盤在資料庫表的ID欄位內。),所有節點的編號長度相同。號可以用到所有的數字、字母、特殊符號。
假如您現在有10000個節點,那么這個編號3位長度即可。因為鍵盤可以輸入的字符(數字、字母、特殊符號)有九十多個,也就是九十進位的三位數。
2、每個節點的長度 * 最大層數 <= 65535。因為mysql的varchar型別的最大長度是65535。
新建資料庫表欄位IDS,IDS的生成規則是 上級的IDS + 本級的ID。
完成了以上操作后,再來看看你的需要
“需求就是A邀請了B 和C、C邀請了D、D邀請了E F G”
假設你的資料庫表中,已有7條記錄,ID是A至G,7條記錄。
根據你的邀請規則,IDS的值如下:
ID IDS ......
A A
B AB
C AC
D ABCD
E ABCDE
F ABCDF
G FBCDG
最后就是一個很簡單的SQL
SELECT * FROM TABLE_NAME ORDER BY IDS ;
uj5u.com熱心網友回復:
有一個字母輸入錯誤,更正后如下:ID IDS ......
A A
B AB
C AC
D ABCD
E ABCDE
F ABCDF
G ABCDG
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/6864.html
標籤:開發
上一篇:求助,表資料誤刪怎么辦
