mysql:10291
From: 渡邊昌之 <渡邊昌之 <mark@xxxxxxxxxx>>
Date: Wed, 06 Oct 2004 09:53:06 +0900
Subject: [mysql 10291] Re: レコードの取得について
渡邊と申します。
結論から言うと、階層が無制限であるかぎり、SQL1行では無理なのではないかと
思います。
探るべき階層が4階層以下という制限があれば、
テーブル名をtestとして、
select a.* from test a
left join test b on a.parent_id=b.id
left join test c on b.parent_id=c.id
where a.id=1 or
a.parent_id=1 or
b.parent_id=1 or
c.parent_id=1;
というようなことをすると一応とれます。
ただし、これは階層が増えるとそのままleft joinが増えていくので
速度を一気に低下させるはずです。
また、レコード数が増えていくと、処理量がかなり増える可能性が高いので
あまりお勧めではないですね。
また、もし自動でどこまでも子をたぐっていくSQLがかけたとしても
それは使用しない方が良いと思います。
なぜなら、何かの間違いで親子関係がループしたとき、それを打ち切る処理が
できない可能性が高いからです。
ループといっても単純に親子がそれぞれ参照している場合だけに限らず
何世代もはなれてループする可能性も有ります。
これはデータ作成時に注意するとしても、100%防げるとは限りません。
そのため、この手のツリーをたぐる処理は呼びだし側のプログラムで
処理したほうがいいと思います。
mizoguci@xxxxxxxxxx (溝口豊) wrote:
> はじめまして。溝口と申します。
> 最近MySQLの勉強をはじめた初心者です。よろしくお願いいたします。
>
> 現在以下のようなテーブルからデータを取得するアプリケーションを
> 作成しています。
>
> カラム | ID | NAME | PARENT_ID
> --------+------+-----------+-----------
> 1行目 | 1 | Akira | NULL
> 2行目 | 2 | Itiro | 1
> 3行目 | 3 | Akane | 2
> 4行目 | 4 | Takashi | 1
>
> <カラムのデータについて>
> ID :レコードのID
> NAME :名前
> PARENT_ID:親のID(レコードのPERENT_IDが1の場合レコード
> のIDが1のレコードと親子関係)
>
> 作成中のアプリケーションで行うことはデータを取得したいレコード
> のIDが指定されたらそのレコードの子にあたるレコードや孫にあたる
> レコードも取得するというものです。
>
> 例1)取得したいレコードのIDが1の場合。
> 1, 2, 3, 4のIDのレコードを取得する。
>
> 例2)取得したいレコードのIDが2の場合。
> 2, 3のIDのレコードを取得する。
>
> しかしそのようにレコードを取得するためにはどのようなSQL文を記
> 述すればよいかわかりませんでした。
> どなたかご存知の方がいらっしゃいましたらお教え願えれば幸いと存
> じます。
> よろしくお願いいたします。
>
> ----
> 溝口豊 mizoguci@xxxxxxxxxx
>
_______________________________________
渡邊昌之
mark@xxxxxxxxxx
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
10283 2004-10-05 22:11 [<mizoguci@xxxxxxxxxx] レコードの取得について 10290 2004-10-06 09:37 ┣["片寄白王" <katayose] -> 10291 2004-10-06 09:53 ┗[渡邊昌之 <mark@xxxxx] 10299 2004-10-06 20:59 ┗[<mizoguci@xxxxxxxxxx]