2011-11-12 13 views
11

私は、特定のフィールドのすべての親、祖父母などを深みを持って探しています。例えば、以下の構造を与えられた私は5提供する場合、値は1、2、3、私はこれを行うだろうか4.MySQLの階層的クエリ

| a | b | 
----------- 
| 1 | 2 | 
| 2 | 3 | 
| 3 | 4 | 
| 4 | 5 | 
| 3 | 6 | 
| 4 | 7 | 

する必要があります返さ?

+2

このためにスキーマを変更する必要があります。 [@BillKarwin](http://stackoverflow.com/users/20860/bill-karwin)のプレゼンテーション[SQLとPHPを使った階層データのモデル](http://www.slideshare.net/billkarwin/models)を読んでください。階層的なデータのために)、さまざまなモデルとそれらを実装する方法について説明します。 – Shef

+0

@Shef:スキーマでどのような変更を行う必要があり、どのようにクエリを書くのですか? –

+0

@BillKarwin:あなたのpptでは、上記のロジックはmysqlを使って行うことができないと言いました。そうですか? –

答えて

22
SELECT @id := 
     (
     SELECT senderid 
     FROM mytable 
     WHERE receiverid = @id 
     ) AS person 
FROM (
     SELECT @id := 5 
     ) vars 
STRAIGHT_JOIN 
     mytable 
WHERE @id IS NOT NULL 
+1

waw ...大きなウェブサイトのように使いすぎると危険ですか? – Wiliam

+2

@Wiliam:MySQLはセッション変数の動作を明確に定義していないので、アップグレードは安全です。しかし、これは、クエリ内のタイムリーな方法で隣接リストを処理する唯一の方法です。 – Quassnoi

+0

参照するだけで(「危険な」とは何かを意味する可能性があります)、誰かがこのことが危険になることについて詳しく説明できますか?それが危険なものになるかどうかは? – Mike

-7

次の回答はMYSQL専用ではなく、PHPを使用しています。この回答は、私が行ったように検索中にこのページに終わるすべての人にとって有益ですが、MYSQLのみを使用することに限定されません。

あなたは、未知の深さの入れ子構造を持つデータベースを持っている場合は、再帰的なループを使用して内容をプリントアウトすることができます:

function goDownALevel($parent){ 
    $children = $parent->getChildren(); //underlying SQL function 
    if($children != null){ 
      foreach($children as $child){ 
       //Print the child content here 
       goDownALevel($child); 
      } 
    } 
} 

また、この関数は、JavaScriptのような他の言語で書き直すことができます。