• 締切済み

MYSQL PERL からの抽出について

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

  • MySQL
  • 回答数2
  • ありがとう数3

みんなの回答

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

  • 何の為に「抽出条件」「または」が2段に分かれてる

    何の為に「抽出条件」「または」が2段に分かれてるのですか? アクセスの使い方がよくわからないので質問します。 ----------------------- テーブル1 苗字(フィールド) 田中 佐藤 伊藤 ・ ・ ・ ----------------------- クエリ1で フィールド:苗字 テーブル:テーブル1 並べ替え: 表示: 抽出条件:"田中" または:"佐藤" ----------------------- と入力して保存しクエリを一回閉じて再度開くと ----------------------- 抽出条件:"田中" Or "佐藤" または:(空白) ----------------------- になってしまいます。 意味は同じだと思うのですが 見た目上、2段のまま保存されたいのですが 自動でorを使われ一段で表示されてしまうのでしょうか? だとしたら何の為に「抽出条件」「または」が2段に分かれてるのですか? わかりやすくするために画像を添付します。

  • Accessでテーブルの内容を抽出したい

    お世話になります。 Access2000で作成しております。 下記のテーブルAがあります。 名前1とタイム1,名前2とタイム2をセットにして、 テーブルBを作成したいのですが、 どのようにすれば作成できるでしょうか? 可能でしたら、「クエリ」で、説明難しければ「SQL」で 教えていただければと思います。 ※SQLの場合は、クエリに変換して使用します。 ----テーブルA---- 番号 名前1 名前2 名前3 タイム1 タイム2 タイム3 1 山田 田中  佐藤 10 8 9 2 鈴木 木村  戸田 7  8 9 ----テーブルB------ 名前 タイム 山田 10 田中  8 佐藤 9 鈴木 7 ・ ・ -------------------- お手数ですがよろしくお願いいたします。

  • MysqlでSUMをつかうとおもうのですが、、、。

    PHPとMySQLを使ってやっています。 以下のように予約テーブルとエージェントテーブルがあります。 予約テーブル                         予約ID  名前   電話番号 エージェント  人数    11  鈴木   ********   11    1     12  佐藤   ********   12    5     13  田中   ********   12    2     14  木村   ********   13    3     15  伊藤   ********   14    4     16  山田   ********   11    8   エージェントテーブル      エージェントID エージェント名       11  JTB         12  HIS         13  KNT         14  HNK         15  KKK   こちらのデータから以下のような検索結果を得たいのですが、 どうすれば宜しいでしょうか? 表示結果                           JTB  HIS  KNT  HNK  KKK      9    7    3    4    0 宜しくお願いします。

  • クエリで複数条件を同時に抽出・出力する方法

    お世話になります。 ACCESSのクエリであるテーブルの入力ミスを抽出したいと考えています。 例えば、氏名と科目と点数があるとします。 No.  氏名  科目  点数 -------------------------- 01 佐藤  国語   80 02 田中  国語   45 03 鈴木  国語   60 04 佐藤  数学   75 05 田中  数学   40 06 鈴木  数学   48 ここで抽出したい条件として、国語は59点以下、数学は49点以下の抽出をしたいとして、今まではクエリの条件に1つずつ科目と点数に条件を入れ1つずつ結果を抽出をしていましたが、同時に結果を得ることができますか?また、結果をリスト表(クエリかレポート)として出力できますか? 拙い文で申し訳ありませんが、分かる方いらっしゃいましたらよろしくお願いいたします。 (スキルとして少しで、ブランクもありますがVBA,SQLです)

  • クエリにおける複数値の抽出について

    クエリにおける複数値の抽出について access2007を使用しています。 テーブルA,テーブルBを元にクエリCを作成しました。 テーブルAには担当というフィールドがありますが,複数の値の入力を許可しており,テーブルBを値集合ソースとして設定してあります。 クエリCにおいて,以下のような抽出をしたいと考えています。 例えば, ID_所員ID_担当 001_B001,B002,B003_山田,佐藤,鈴木 002_B002_佐藤 003_B001,B002_山田,佐藤 において,所員IDの抽出条件のところにB002と入力すると,ID002のみが抽出されるといった感じです。 B002と抽出条件を設定すると,B002を含む全てのレコードが抽出されてしまいます。この場合ですと,ID001から003の全てのレコードが抽出されます。 担当のところで抽出条件を佐藤と設定し,さらに所員IDの抽出条件のところに,Len関数を使用して4文字以下とすれば…とも考えたのですが上手くいきません。 もし,良い方法があればご教示ください。

  • 名簿のテーブルから「名前」か「読み」が一致する人を抽出したいと思ってい

    名簿のテーブルから「名前」か「読み」が一致する人を抽出したいと思っています。 $namekey = "佐藤"; $yomikey = "さとう"; mysql_query("SELECT * from meibo where name = '$namekey' or yomi = '$yomikey'); このようにしたところ、検索ワードである「佐藤」「さとう」もいっしょに抽出してしまいました。 検索ワード以外だけを抽出したい場合はどのような方法があるのでしょうか。

    • ベストアンサー
    • MySQL
  • Accessの選択クエリの抽出条件について

    いちもお世話になります。Access2002を勉強中の初心者です。 顧客テーブルから選択クエリを作っています。クエリのフィールドには「都道府県」(東京、埼玉、千葉...)と「顧客名」(山田、佐藤、田中...)があります。 「顧客名」の山田以外を抽出したいのですが、但し「都道府県」が東京の場合は山田以外の条件を外したいのです。つまり、埼玉、千葉の山田は抽出しませんが東京の山田は抽出したいのです。 このような抽出条件の設定ができますか? アドバイス、よろしくお願いします。

  • DBkらの抽出した結果を整列されるためにはどうしたらよいですか。

    宜しく御願いたします。 現在のソースになります。 <?php $test = $DB->getAll("SELECT nicname,point FROM ".$k_user_table." order by point DESC LIMIT 0,3 "); print_r($test); ?> 上記の表示結果はこちらです。 Array([0]=>Array([0]=>田中さん[nicname]=>田中さん[1]=>100 [point]=>100 [1]=>Array([0]=>木村さん[1]=>124 [point]=>124 重複を無くして改行を付けたいと思っております。 理想はこちらです。↓ 田中さん 100PT所有 木村さん 124PT所有 の様な感じです。 宜しく御願いたします。

    • ベストアンサー
    • Perl
  • MySQLで連番をつけて抽出したい

    以下のようなテーブル(test)があるとします。 id type  age --+----+----- 1  A   15 2  B   21 3  C   32 4  A   18 5  A   16 6  D   34 7  A   55 8  C   22 このテーブルを「SELECT * FROM test where type = 'A' order by id」で抽出すると、 id  type age --+-----+--- 1  A   15 ---(1) 4  A   18 ---(2) 5  A   16 ---(3) 7  A   55 ---(4) となると思いますが、phpからは「typeAで4番目に登録したもの」としてとしてクエリが 送られてくるので、id7のデータを4として抽出したいのです。 (search.php?type=A&no=4 という感じです) スマートに1文でいけますでしょうか? MySQLのバージョンは4.0.27です。 お詳しい方、どうぞ宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • Mysqlで複数テーブルの参照

    Mysqlで複数テーブルの参照 お世話になります。Mysqlについて質問させてください。 現在、それぞれnameとdateとflagの3フィールドをもつテーブルが、2つあります。 もともと別の用途で準備したものなのですが、 2つのテーブルのflagを参照して、1のものだけdate順に並べることが出来るでしょうか? ■テーブル1 -----------------------------  name |  date  |flag| -----------------------------  田中 | 2010-06-01 | 1 -----------------------------  山田 | 2010-09-01 | 1 -----------------------------  田辺 | 2010-10-01 | 2 -----------------------------  田所 | 2010-11-01 | 2 ----------------------------- ■テーブル2 -----------------------------  name |  date  |flag| -----------------------------  加藤 | 2010-10-01 | 1 -----------------------------  佐藤 | 2010-07-01 | 1 -----------------------------  織田 | 2010-12-01 | 2 -----------------------------  斎藤 | 2010-01-01 | 2 ----------------------------- ■求める結果 -----------------------------  name |  date  |flag| -----------------------------  田中 | 2010-06-01 | 1 -----------------------------  佐藤 | 2010-07-01 | 1 -----------------------------  山田 | 2010-09-01 | 1 -----------------------------  加藤 | 2010-10-01 | 1 ----------------------------- 具体的なSQL文でなくとも構いません。参考になるような情報、サイトをご存じでしたら、教えてください。 よろしくお願いします。

    • ベストアンサー
    • MySQL