2013-08-06 35 views
5

私はmysqlで新しいです。これは私のテーブルです:mysql再帰(ツリー)親子カテゴリ

カテゴリ表:

id | name  | prent 
---------------------------- 
1 | os   | null 
2 | linux  | 1 
3 | ubuntu  | 2 
4 | xubuntu  | 3 
5 | lubuntu  | 3 
6 | zubuntu  | 3 
7 | zubuntu 2 | 6 
8 | suse  | 2 
9 | fedora  | 2 
10 | windowse | 1 
11 | windowse xp | 10 
12 | windowse 7 | 10 
13 | windowse 8 | 10 
14 | food  | null 
15 | dance  | null 

各カテゴリは、親を持って、私は、ドロップダウンメニューに表示するためにそれらを準備します。

これは私が取得したいものです。

id | name   | depth 
---------------------------- 
1 | os   | 0 
2 | -linux  | 1 
3 | --ubuntu  | 2 
4 | ---xubuntu | 3 
5 | ---lubuntu | 3 
6 | ---zubuntu | 3 
7 | ----zubuntu 2 | 4 
8 | --suse  | 2 
9 | --fedora  | 2 
10 | -windows  | 1 
11 | --windows xp | 2 
12 | --windows 7 | 2 
13 | --windows 8 | 2 
14 | food   | 0 
15 | dance   | 0 

ここで、カテゴリは順序ではなく、私のコードは、これまで親から子カテゴリの順序を提供しなければなりません。名前の前に字下げが各カテゴリの親の深さに基づいて提供されます。各カテゴリの子供の数に制限はありませんが、カテゴリの総数は100を超えません。

このような結果をもたらすクエリはありますか? PHPフレームワークでactive recordの形式で実行できるクエリが好きです。

+1

なし。 mysqlは再帰クエリをサポートしていません。ツリーの途中で作業するには、コード内で反復ループを実行する必要があります。 –

+0

あなたはここを見ましたか? http://stackoverflow.com/questions/8633497/mysql-how-to-query-parent-child?rq=1 –

+0

@EdManetでは、1つ以上の深さの数はどのくらいですか? – monjevin

答えて

9

これはThreadです。ここ@RolandoMySQLDBA

DELIMITER $$ 
DROP FUNCTION IF EXISTS `GetAncestry` $$ 
CREATE FUNCTION `GetAncestry` (GivenID INT) RETURNS VARCHAR(1024) 
DETERMINISTIC 
BEGIN 
    DECLARE rv VARCHAR(1024); 
    DECLARE cm CHAR(1); 
    DECLARE ch INT; 

    SET rv = ''; 
    SET cm = ''; 
    SET ch = GivenID; 
    WHILE ch > 0 DO 
     SELECT IFNULL(`prent`,-1) INTO ch FROM 
     (SELECT `prent` FROM Table1 WHERE id = ch) A; 
     IF ch > 0 THEN 
      SET rv = CONCAT(rv,cm,ch); 
      SET cm = ','; 
     END IF; 
    END WHILE; 
    RETURN rv; 

END $$ 
DELIMITER ; 

作業fiddleに感謝します。

SELECT id,GetAncestry(id) as parents from Table1 where id = 7; 

ID PARENTS 
7 6,3,2,1 
+0

ありがとう、「A」がここに何を意味するのか分かりますか? – monjevin

+0

'A'はこの結果セットのエイリアス名です:(SELECT' prent' FROM Table1 WHERE id = ch) –

+0

私はこの機能がどれくらいクールだと認識していますか?しかし、祖先のデータをどのように階層リストに追加するのかを説明することができます(遅く、私の脳は発射しません) – Hightower