• 締切済み

MYSQL PERL からの抽出について

こんにちは。 宜しく御願いたします。 携帯サイトのMYSQLデータベースから抽出を行っておりますが出来ない部分があります。 テーブルにあるそのままのものを抽出する事は出来たのですが、関数と言いますか定義と言いますか、queryを使いテーブルの中にあるものから ~の~の~の合計を取得の様な定義づけが分かりません。 例えば、木村と言う方が田中と言う方を紹介し、田中が佐藤を紹介し、それぞれの紹介人数の合計もさらに抽出といった感じです。 結果 木村は田中を紹介しました 田中は佐藤を紹介しました 佐藤は○○と○○を紹介しました 問題は、木村が田中を紹介した「定義づけ」です。 例えば固体識別より、queryで検索をかけてするのか、メールアドレスにより選別するのかなどで変わると思われます。 一番より方法は御座いませんか?   

みんなの回答

noname#98692
noname#98692
回答No.2

これはデータベース(以下 DB と表記)を操作するプログラムで、DB そのものではありません。DB から目的の情報を得るには、DB にある情報の構造を知っている必要があります。どんなテーブルがあって名前は何か、テーブルにはどのようなカラムがあるのか、といったことです。資料がこれだけですと、手探りで構造を想定することになります。 あと、質問が「MYSQL PERL からの抽出について」となっていますが、これは Perl ではなく PHP で書かれています。Perl と PHP は別の言語です。 以下は完全に想像になってしまうことを念頭に置いて下さい。 intro は introduce の略だと思います。誰がいつ誰を紹介したかという履歴が保存されているテーブルがあり、変数 $k_intro_table にそのテーブル名が入っていると考えられます。 テーブル名が変数になっているということは、データが複数のテーブルに分けられている可能性があります。かなりの登録件数を擁するシステムでユーザーIDや登録日時でパーティショニングしているとか、サービスやカテゴリごとにテーブルが違う等理由は色々考えられます。 このテーブルは次のような構造だと予測されます。 num プライマリキー k_id 紹介主の id intro_id 紹介相手の id intro_time 紹介した日時 num | k_id | intro_id | intro_time ----+------+----------+------------------ 1 | 1001 | 2010 | 2009-02-01-00:00 2 | 102 | 2020 | 2009-02-01-01:00 3 | 200 | 2110 | 2009-02-01-02:10 4 | 250 | 2222 | 2009-02-01-03:03 多分こんな感じのテーブルでしょう。常識的に考えて、別にユーザー情報のテーブルがあるはずです。id 1001 が 伊藤 というのがわかるためのテーブルです。 以上をふまえてコード内にあるクエリを見ていきます。 select * from $k_intro_table where k_id='$s_id' これは、紹介主の id が $s_id であるレコードをカウントしています。結果は、$TOTAL に代入されています。 次に while ループで項目をそれぞれ取り出すためのクエリがありますが order by num DESC Limit $page,100 の部分が増えているだけです。誰がだれをいつ紹介したのかを見るページでは1ページに何件かずつ表示しているため必要な件数だけをページ送りに応じてデータを取り出しているのだと思います。 本題の > 木村と言う方が田中と言う方を紹介し、田中が佐藤を紹介し、 > それぞれの紹介人数の合計もさらに抽出 ですが、これを行うには再帰的な検索が必要になります。ページ送りが必要なほど、多数のユーザーですから、一人に対して繋がる人数を全て検索するには(ネズミ算式に)検索回数が増えることが容易に想像できます。もとのデータの規模がわからないのでなんともいえないのですが"ただ動くだけのコード"では、負荷や速度の面において不安があります。 登録人数がある程度の数までなら、別のデータ構造(アプリ内の配列や別のテーブルや memcached とか)にユーザーごとのカウントを蓄積していく方がクエリの数が少なくて済むだろうし、その集計がどのくらいの頻度で行われるかでも最善策は違います。 例えば、一ヶ月に一回全員の合計を出すのと、毎日時々特定ユーザーについて調べたいのと、一般ユーザーが会員のプロフィールにアクセスしたときに連鎖している紹介人数を表示したい等のケースが考えられます。 「一般ユーザーが会員のプロフィールにアクセスしたときに連鎖している紹介人数を表示したい」ですと、かなり頻繁に求める必要があるので、"ただ動くだけのコード"で実装するのは無理があります。キャッシュしたり、ごまかしたり工夫して近似的に求める必要があります。 そういった環境についてわからないので具体的な SQL 文やコードは提示しないでおきます。 コード片だけでテーブルの構造をつきとめ、クエリを作ったとしても、結果を表示するのにはコードを理解して修正する必要がありますし。 正直、もとのアプリを作った会社にきちんと機能拡張について相談するのがよいかと思います。 結果的に解決に繋がるものにならなかったことをお詫びいたします。

koloru
質問者

お礼

詳しくご説明頂き有り難う御座います。 雰囲気的に分かりました。 >>「一般ユーザーが会員のプロフィールにアクセスしたときに連鎖している紹介人数を表示したい」ですと、かなり頻繁に求める必要があるので、"ただ動くだけのコード"で実装するのは無理があります。キャッシュしたり、ごまかしたり工夫して近似的に求める必要があります。 なるほど。。。 DBだけの操作ではやはり難しいのでしょうかね。。。 ちょっともう少し色々勉強してから再度トライしたいと思います。 有り難う御座いました。

noname#98692
noname#98692
回答No.1

誰が誰を紹介したかという記録を残す方法は、色々な形が考えられますが、それがどう設計されているのかわからないと答えようがないです。 現在どのようなデータがあるのか、データベースのテーブルの構造はどうなっているのか。もしかしたら、直接データベースに問い合わせなくてもそれを知るようなメソッドが用意されているかもしれません。

koloru
質問者

お礼

さすがですね。。。 管理画面はパソコンで行っているのですがパソコンでは見れます。 dbinc.phpファイルにてまとめてDB抽出管理しているようです。 そこからテンプレや<?=$○○?>と簡単な形に振り分けておるようです。 ただ、管理者は見れてもユーザーが見れないとダメなのでinc.phpをいじれない頭ですから直接その条件でphpファイルより抽出を考えておりました。 プログラムは買ったものです。 ちなみにパソコンから閲覧できるdbは次のようになっております。 ////////紹介元からの紹介ID取得//////// function intro_ranking_list($DB,$k_intro_table,$page,&$total,&$TOTAL,&$num,&$k_id,&$intro_id,&$intro_time,$s_id) { $result = $DB->execute("select * from $k_intro_table where k_id='$s_id'"); $TOTAL=$result->RecordCount(); $result = $DB->execute("select * from $k_intro_table where k_id='$s_id' order by num DESC Limit $page,100"); $total=$result->RecordCount(); while($row =$result->FetchRow()) { $num[] = $row[0]; $k_id[] = $row[1]; $intro_id[] = $row[2]; $intro_time[] = $row[3]; } こちらは管理画面用のdbinc.phpになります。 ユーザーページの場合これまた別な携帯用のdbincclass.phpがあり、これがいじれないのでなんとかパソコン用から改造でき無いかなぁと試行錯誤しておりました。 宜しくお願いいたします。

関連するQ&A