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

mysql:6224

From: <rio-t@xxxxxxxxxx>
Date: Thu, 19 Sep 2002 03:16:41 +0900 (JST)
Subject: [mysql 06224] Re: スレッド式掲示板のテーブル構造について

こんにちは、高石です。

丁度RDBMSを使用した掲示板の設計についてあれこれ考えていたと
ころだったので、これも何かの縁ということで反応してみます。

# なお、このメールにはmysqlの話はかけらも出てきません:-P

From: Tybalt of Capulet <ice-man@xxxxxxxxxx>
Subject: [mysql 06223] Re: スレッド式掲示板のテーブル構造について

> が、!どうしてもわからない部分があります。
> 多分メインの部分なのですが。
> 勝手に上記のページのソースを抜き出してしまいますが、
> この18行目と19行目がいまいちわかりません。
> しょっぱなに呼び出される時は
> Show_Itself_And_Call_Children(0,-1);
> となっており引数は0と-1ですよね。
> てことは18行目で行っているセレクトは最初に親記事を全て読み込んでるわけですよね。
> しかしせっかく読み込んだ親記事のデータが次の再起処理で子をセレクトする時に全部消えてしまうわけですか?
> さらに子の記事が終わった時に次の親記事はどうやってセレクトしているのでしょう。
> ここまでくるとMySQLの話題ではないような気もしますが
> あと一息なので何卒お付き合いいだき、ご教授いただけないでしょうか?
> よろしくお願いいたします。
 
まずは、「再帰呼出」という概念をしっかり理解することが必要で
す。どんな言語でもいいので、プログラミング(CGIとかDBとかに特
化したものでなく一般的な)の入門書を見れば、大抵載っていると
思います。
あるいはGoogleとかで検索してみるだけでも足りるかもしれません。

一応簡単に説明してみます。

Show_Itself_And_Call_Children() という関数で行っていることは、

1.$numberが0以外なら自分を表示する。
2.自分の子記事全部に対して順番に
  Show_Itself_And_Call_Children()を呼び出す。

これだけです。
ポイントは、Show_Itself_And_Call_Children()の中で、また
Show_Itself_And_Call_Children()を呼び出している点です。

# 長いのでこれ以降、略してShow()と書きます。
# また第2引数のindentは処理の流れに直接関係ないので省略。

仮に次のようなスレッドがあったとします。
(0番はrootで実体は存在しない)

0
+-1
| +-3
|   +-5
+-2

まず、Show(0)を実行すると、
0の子は1と2なので、19行目のwhileで、
Show(1)
Show(2)
が順番に呼び出されるわけですが、このShow(1)の中でShow(3)が呼
ばれ、さらにその中で、Show(5)が呼ばれます。
そして、Show(5)の処理が終わると呼出し元のShow(3)に戻って、
Show(3)が終わればShow(1)に戻り、Show(1)が終わるとShow(0)の処
理に戻ります。
Show(0)では、Show(1)の次にShow(2)を呼び出すので、

最終的には、

-- Show(0)開始 --
  -- Show(1)開始 --
    記事1を表示
    -- Show(3)開始 --
      記事3を表示
      -- Show(5)開始 --
        記事5を表示
      -- Show(5)終了 --
    -- Show(3)終了 --
  -- Show(1)終了 --
  -- Show(2)開始 --
    記事2を表示
  -- Show(2)終了 --
-- Show(0)終了 --

という順番に実行されることになるのです。
ここで重要なのは、$numberなどの値は各呼出しごとに独立してい
るという点です。
Show(5)の中では$numberは5ですが、Show(5)が終わってShow(3)に
戻れば$numberは3のまま変っていません。

> (1) //一覧を表示する
> (2) Show_Titles();
> 
> (3) function Show_Titles(){
> (4)   Show_Itself_And_Call_Children(0,-1);
> (5) }
> 
> (6) function Show_Itself_And_Call_Children($number, $indent){
> (7)   //表示
> (8)   if ($number != 0){
> (9)     $result = mysql_query("select * from bbs where number=$number");
> (10)     $row = mysql_fetch_array($result);
> (11)     $title = $row[title];
> (12)     $name = $row[name];
> (13)     //print("親:[$row[parent_number]]");
> (14)     print str_repeat("-",$indent);
> (15)     print ("$number: <a href=\"bbs2.php?print_number=$number\">$title:$name</a><BR>");
> (16)   }
> (17)   //子供呼び出し
> (18)   $result = mysql_query("select * from bbs where parent_number=$number");
> (19)   while ($row=mysql_fetch_array($result))Show_Itself_And_Call_Children($row[number], $indent+1);
> (20) }

/--------------------------------------------------------/
  高石 勇人 < rio-t@xxxxxxxxxx >
  PGP Key(RSA): http://rio-t.presen.to/pgp/mykey.asc
         (DSS): http://rio-t.presen.to/pgp/mykey-dss.asc
/--------------------------------------------------------/

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

      6207 2002-09-18 19:27 [Tybalt of Capulet <i] スレッド式掲示板のテーブル構造について  
      6208 2002-09-18 19:36 ┣[荒井 哲三 <tetsumi.]                                       
      6209 2002-09-18 19:45 ┣[Yuya.Nishida. <yuya@]                                       
      6210 2002-09-18 20:23 ┃┗[Tybalt of Capulet <i]                                     
      6211 2002-09-18 20:33 ┃ ┣[Tomohiro 'Tomo-p' KA]                                   
      6213 2002-09-18 20:41 ┃ ┣["Kaigai Kohei" <kaig]                                   
      6214 2002-09-18 20:49 ┃ ┣[Yuya.Nishida. <yuya@]                                   
      6216 2002-09-18 20:54 ┃ ┗[Takanori Tobe <taka@]                                   
      6212 2002-09-18 20:37 ┣[NAGASAWA Teruo <ml@x]                                       
      6217 2002-09-18 21:16 ┣[HAMAI Kyoichi <k-ham]                                       
      6225 2002-09-19 03:20 ┃┗["umemura" <shigemi.u]                                     
      6218 2002-09-18 21:17 ┣["KAWAI,Takanori" <GC]                                       
      6219 2002-09-18 21:33 ┃┗[Tomohiro 'Tomo-p' KA]                                     
      6220 2002-09-18 22:02 ┃ ┗["KAWAI,Takanori" <GC]                                   
      6222 2002-09-18 22:14 ┃  ┣["黒木 玲" <kuroki434]                                 
      6223 2002-09-19 01:02 ┃  ┃┗[Tybalt of Capulet <i]                               
->    6224 2002-09-19 03:16 ┃  ┃ ┣[<rio-t@xxxxxxxxxx>  ]                             
      6227 2002-09-19 07:15 ┃  ┃ ┃┣["kosugi" <kosugi@xxx]                           
      6228 2002-09-19 09:32 ┃  ┃ ┃┃┗["Takashi Yamashita" ]                         
      6229 2002-09-19 10:06 ┃  ┃ ┃┗[Tybalt of Capulet <i]                           
      6230 2002-09-19 10:21 ┃  ┃ ┃ ┗["黒木 玲" <kuroki434]                         
      6232 2002-09-19 11:01 ┃  ┃ ┃  ┗[Toyoshima Hiroshi <t]                       
      6233 2002-09-19 11:33 ┃  ┃ ┃   ┗[Tomohiro 'Tomo-p' KA]                     
      6236 2002-09-19 12:26 ┃  ┃ ┃    ┗[Toyoshima Hiroshi <t]                   
      6237 2002-09-19 12:52 ┃  ┃ ┃     ┗[HAMAI Kyoichi <k-ham]                 
      6231 2002-09-19 10:46 ┃  ┃ ┗["KAWAI,Takanori" <GC]                             
      6234 2002-09-19 12:18 ┃  ┗[<n.futami@xxxxxxxxxx]                                 
      6238 2002-09-19 13:52 ┃   ┣["kosugi" <kosugi@xxx]                               
      6247 2002-09-20 11:50 ┃   ┗[Tybalt of Capulet <i]                               
      6248 2002-09-20 12:53 ┃    ┣[Yuya.Nishida. <yuya@]                             
      6249 2002-09-20 13:21 ┃    ┃┗["KAWAI,Takanori" <GC]                           
      6252 2002-09-20 13:59 ┃    ┃ ┗[Yuya.Nishida. <yuya@]                         
      6251 2002-09-20 13:51 ┃    ┣["KAWAI,Takanori" <GC]                             
      6255 2002-09-20 22:53 ┃    ┗["kosugi" <kosugi@xxx]                             
      6257 2002-09-21 02:31 ┃     ┗[Tybalt of Capulet <i]                           
      6258 2002-09-21 05:18 ┃      ┗["kosugi" <kosugi@xxx]                         
      6259 2002-09-21 08:18 ┃       ┣["黒木 玲" <kuroki434]                       
      6260 2002-09-21 09:40 ┃       ┗["KAWAI,Takanori" <GC]                       
      6261 2002-09-21 11:16 ┃        ┗["kosugi" <kosugi@xxx]                     
      6262 2002-09-21 11:46 ┃         ┗["kosugi" <kosugi@xxx]                   
      6221 2002-09-18 22:10 ┣["kosugi" <kosugi@xxx]                                       
      6226 2002-09-19 06:39 ┃┗["kosugi" <kosugi@xxx]                                     
      6235 2002-09-19 12:25 ┣[You2 <ml-mysql@xxxxx]                                       
      6239 2002-09-19 15:01 ┗[平松 幸治 <kouji@xx] OR と AND を複数使った検索で・・・    
      6240 2002-09-19 15:09  ┣[平松 幸治 <kouji@xx]                                     
      6243 2002-09-19 15:35  ┃┗[平松 幸治 <kouji@xx]                                   
      6244 2002-09-19 16:34  ┃ ┗["Takashi Yamashita" ]                                 
      6250 2002-09-20 13:40  ┃  ┗[平松 幸治 <kouji@xx]                               
      6241 2002-09-19 15:16  ┣[SAKIMURA Noriyuki <s]                                     
      6242 2002-09-19 15:16  ┗[Daiju Azuma <daiju_a]