mysql:9913
From: ML account <ML account <ml@xxxxxxxxxx>>
Date: Wed, 28 Jul 2004 17:13:04 +0900
Subject: [mysql 09913] Re: 芋づる式検索について
こんにちは。 yoshiyama akihiko <yoshiyama@xxxxxxxxxx>さんの <20040728042607.45F3CFD80B@xxxxxxxxxx> "[mysql 09906] 芋づる式検索について" > はじめまして。検索処理でアドバイスをお願いします。 > > before after > ------------- > a b > b c > c NULL > > 上記のデータは、値aは値bに変わった、値bは値cに変わったことを > 表しています。値cは変わらないのでafterがNULLです。 > > 値aが値cに変わったことを知りたいのですが、SQL文が思いつきません。 > afterがNULLになるまでたどることはできるでしょうか。 3過程(a->b, b->c, c->NULL)で変化するのが確定なら、検出するのは比較的 簡単でしょう。 ----定義と初期化(一回限り実行)---- create table test08 (before char(1),after char(1)); insert into test08(before,after) values('a','b'); insert into test08(before,after) values('b','c'); insert into test08(before,after) values('c',NULL); ----実行---- select s0.before,s1.before,s2.before,s2.after >from test08 as s0 inner join (test08 as s1 inner join test08 as s2 on s1.after=s2.before) on s0.after=s1.before where s0.before='a' and s2.after is NULL; 速度的にお勧め出来るかは別問題です。インデックスを付けたとしてもレコー ド数の三乗に比例して時間が掛かるでしょう。 幾つの過程を経て変化するのかが分からない場合、1発のクエリで行うのは無 理でしょう。クエリを乱発する必要があるでしょうね。DBMSの種類やバージョン 依存で良いのであれば、こんな感じで出来る事は出来ます。一応、循環(a->b、 b->aの様な)や分岐(a->b、a->dの2つがある)も考慮しています。過程数には、 textの文字列長の制限があります(超過すると永久ループ)。 ----定義と初期化(一回限り実行)---- create table tmp08 (str text,next char(1),steps int); set @_first='a'; insert into tmp08 (str,next,steps) select @_first,after,1 from test08 where before=@_first; ----実行---- select @_maxsteps:=max(steps) from tmp08; insert into tmp08 (str,next,steps) select concat(tmp08.str,test08.before) as newstr ,test08.after as newnext,steps+1 as newsteps from tmp08,test08 where tmp08.next=test08.before and tmp08.steps=@_maxsteps and test08.before <> @_first; 新規挿入されるレコードがある、あるいはtmp08.nextがNULLのレコードが存在 しない間は、「実行」の部分のクエリ2発を繰り返し発行します。変化するしな いの判定は tmp08.nextがNULLのレコードが存在するかしないかで行います。 MySQL変数の@_firstと@_maxlenを言語の変数に取る方がまだしも一般形でしょ うか。 松枝知直 <tomom@xxxxxxxxxx> http://www.argus.ne.jp/~tomom/
9906 2004-07-28 13:26 [yoshiyama akihiko <y] 芋づる式検索について -> 9913 2004-07-28 17:13 ┗[ML account <ml@xxxxx] 9923 2004-07-29 11:00 ┗[yoshiyama akihiko <y] 9925 2004-07-29 13:09 ┗[SAITO Masaru <daisai] 9927 2004-07-29 14:53 ┗[ML account <ml@xxxxx]