• 締切済み

PHPとjQueryでツリー

はじめまして。プログラムを独学で学んでいる者です。 今回初めて開発をしてみたのですが、どうしてもうまくいかないため こちらに投稿した次第です。 やりたいことは以下の通りです。 PHPとJQueryツリー構造 (完成図) 親 ■ツリー(1)  |  ■親データ(2)  | |  |  ∟■子データ(3)  |    |  |     ∟■孫データ(4)  |       |  |        ∟■孫2データ(5)  |  ■親データ  | |  |  ∟■子1データ  |  ■親データ  | |  |  ∟■子1データ  | |  |  | |   ∟■孫1データ  | |  |  ∟■子2データ  |  ■親データ  | |  |  ∟■子1データ  |    |  |     ∟■孫1データ  |       |  |        ∟■孫2データ  |  ■親データ 表示部分で親データの表示をだしつつ、子データのSQLをとばして子データの表示をだしつつ、孫データのSQLをとばす。 これを繰り返したい。 (1)まず親データのSQLをとばす。 (2)親データを一件取得したら、表示する。その親SQLで得られた結果をもとに子SQLをとばす。 (3)子データがあれば表示。(なければ2件目の親データを取得。) 子SQLで得られた結果をもとに、さらに子SQLを飛ばす。 (4)そこに結果があれば孫データとして表示。(なければ2件目の親データを取得) 得られた結果をもとに子SQLを飛ばす。 (5)結果があれば次の孫データとして表示。 結果が存在しなければ、親データに戻り・・・・繰り返し上記のように処理する。 自分で試行錯誤し、phpとjQueryでなんとか上図のように親--子--孫と出せるようになりました。 しかし、1件ごとに子・孫データが無いかSQLを飛ばして調べるので、非常に時間がかかります。 データが30件ほどあると表示するのに10分はかかります。 処理しきれずに途中で終わってしますこともシバシバ・・・・。 他の方法として考えたのが、親データがクリックされたら子SQLを飛ばして展開部分を表示するという方法です。 しかしクリックしたらメソッドを呼び出すという、phpの処理を分割することはできないとネットに乗っていました。 (私の調べ方に問題があったのかもしれませんが・・・) <ul> <li id=id>親データ   <ul>     <li id=id2>子データ      <ul>      <li id=id3>孫データ      </ul>  </ul> <li id=id>親データ2 ・ ・ ・ ↑のような構造で「<li id=id>親データ」がクリックされたときに、phpの子SQLをなげる仕組みなどは 可能なのでしょうか? それとも地道にSQLを投げて1件ずつ確認する方法しかないのでしょうか? プロの方の意見等、知恵をお借りしたいです。 ご教授よろしくお願い致します。

みんなの回答

回答No.4

SQLで階層構造を表現する手法として、有名なものがあるようです。 http://www.geocities.jp/mickindex/database/db_tree_ns.html こちらを見て下さい。 CakePHPのビヘイビア(プラグインのようなもの)でTreeというものがありそれのアルゴリズムを確認していた時に たどり着いたサイトです。 実は文章量が多く、自身ではうまく把握できませんでした。 ただ、この内容がわかると、質問者さんが行いたい出来事がかなりスムーズに解決するような気はします。

すると、全ての回答が全文表示されます。
回答No.3

私も得意ではありませんが、 この現象はSQLやDBの作りのせいで、パフォーマンスが上がってないような気がします。 レコード数等にももちろんよるとは思いますが、もう少し最適化できるんじゃないでしょうか? インデックスの作成や、SQLの見直しを私だったらまず最初にしてみます。 select * from とかなさってませんか?

popoamino
質問者

お礼

muuming2001様 回答ありがとうございます。 そうですね・・・「*」は使っていません。 ただ「RIGHT JOIN」がSQL中に8回使っているので、もしかしたらJOIN句が遅くしている原因なのか・・?とは考えましたが・・・ コマンド上でSQLを投げると44件抽出する場合の応答時間は0.7秒ほどですので、やはりプログラムの構造が悪いのかな?と思いました

すると、全ての回答が全文表示されます。
  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.2

こんにちは。 jQueryを利用しているということですのでAjaxを利用すれば実現できると思います。 ノードのトップに紐づく親データを取得して表示しておき、質問者様の考えている >↑のような構造で「<li id=id>親データ」がクリックされたときに、phpの子SQLをなげる仕組みなどは>>可能なのでしょうか? でその配下のデータを取得します。 >しかしクリックしたらメソッドを呼び出すという、phpの処理を分割することはできないとネットに乗っていました。 作り方次第なんだと思います。 Ajaxについて調べてみてください。 初期表示時は親となるデータを取得 クリック時は子、孫となるデータを取得 するようなPHPを作ればいいわけです。

popoamino
質問者

お礼

LancerVII様 回答ありがとうございます。 なるほど!Ajaxというものがあるのですね! やはり私の調べ方に問題があったのかもしれないですね・・・・ 調べてみようと思います。 教えて下さってありがとうございます。

すると、全ての回答が全文表示されます。
  • kamikami30
  • ベストアンサー率24% (812/3335)
回答No.1

表示したい構造はわかるが、 何を表示したいのかいまいち明確じゃないです。 ○○の~となっているデータを、□□を使って△△に●●の書式で出力したい。 ○○とその詳細の~、 △△がわかりません。 ○○はデータベースのような気もしますが、 データベースの構造をツリーで出しても見辛いから違うかなと。 データって言ってしまうと何でもデータなので、よくわからないんです。

popoamino
質問者

お礼

kamikami30様 回答ありがとうございます。 説明がわかりにくく、大変申し訳ありませんでした。 私がわからなかったのは、Oracleのデータベースから、SQLを投げて得た結果をPHPとjQueryによってブラウザに表示するというものです。 親になるデータと子・孫になるデータを得るには別々のSQLを投げるので非常に時間がかかり困っていました。

すると、全ての回答が全文表示されます。

関連するQ&A