2017-07-27 14 views
0

日安地球人,MySQL查詢:在同一臺多級分類

這是我的表結構

acctCode| refAcctCode | acctName 
------ ---------- -------- 
AC001     SALES 
AC002     AR 
AC003  AC001   FURNITURE 
AC004  AC003   OFFICE FURNITURE 
AC005  AC002   INVOICE 
AC006  AC001   UTILITIES 

和預期產出將

SALES 
    FURNITURE 
     OFFICE FURNITURE 
    UTILITIES 
AR 
    INVOICE 
但是

它它不僅僅限於第3級,而是第n級

例如:

Parent1 
    Child1 
    child1.1 
     child1.1.1 
     child1.1.1.1 
    child2 
    child3 
    child3 

parent2 
    child1 
    child2 
    child3 

鑑於表格結構格式,我該如何查詢以獲取該輸出?

感謝

+0

請將格式添加到您的問題 – Max

+0

對不起,先生,但我目前的連接是不穩定的ATM。頁面加載時間超出預期。 – Anvy

+0

MySQL目前不支持遞歸。選項包括儘可能頻繁地將表連接到自身,寫入存儲介質,在應用程序代碼中處理遞歸邏輯,或切換到替代模型,例如,嵌套集合。所有這些選項已被廣泛討論。 – Strawberry

回答

0

這是基於用戶定義的過程的解決方案:

CREATE PROCEDURE list() 
BEGIN 
DROP TABLE IF EXISTS tmp; -- for collecting the records 
CREATE TABLE tmp (id varchar(1024), name varchar(128)); 
SET @i=-5; SET @s=0;  -- @i: offset for id comparison 
          -- @s: space padding for name column 
INSERT INTO tmp   -- fill in entries without refAcctCode 
SELECT a.acctCode, a.acctName FROM tbl a WHERE a.refAcctCode is null; 

          -- do as often as necessary ...  
WHILE ROW_COUNT() > 0 DO 
    SET @[email protected]+6; SET @[email protected]+2;-- increment variables 
    INSERT INTO tmp 
    SELECT CONCAT(id,' ',a.acctCode), CONCAT(SPACE(@s),a.acctName) 
    FROM tbl a INNER JOIN tmp b ON SUBSTR(id,@i)=a.refAcctCode; 
END WHILE; 

SELECT * FROM tmp ORDER BY id; -- list the consolidated temp. table 
END; 

通過與

CALL list() 

執行它會得到以下的輸出:

id    name 
------------------------------------------ 
1 AC001    SALES 
2 AC001 AC003   FURNITURE 
3 AC001 AC003 AC004  OFFICE FURNITURE 
4 AC001 AC006   UTILITIES 
5 AC002    AR 
6 AC002 AC005   INVOICE 

你可以找到一個工作演示在這裏:http://rextester.com/ZRXN57872

我用空格作爲accName的前綴列。這樣可以更輕鬆地查看結果列表中的類別級別。隨意玩這個程序,以適應你的特殊需求。

+0

輝煌的先生。但是當我將代碼粘貼到mysql上。 while語句中出現錯誤。 – Anvy

+0

您能否向我們提供實際的信息?有時在MySQL中可能存在分隔符問題,請參閱此處:https://stackoverflow.com/questions/10259504/delimiters-in-mysql – cars10m