[前][次][番号順一覧][スレッド一覧]

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]