こんにちは。
宜しく御願いたします。
携帯サイトのMYSQLデータベースから抽出を行っておりますが出来ない部分があります。
テーブルにあるそのままのものを抽出する事は出来たのですが、関数と言いますか定義と言いますか、queryを使いテーブルの中にあるものから
~の~の~の合計を取得の様な定義づけが分かりません。
例えば、木村と言う方が田中と言う方を紹介し、田中が佐藤を紹介し、それぞれの紹介人数の合計もさらに抽出といった感じです。
結果
木村は田中を紹介しました
田中は佐藤を紹介しました
佐藤は○○と○○を紹介しました
問題は、木村が田中を紹介した「定義づけ」です。
例えば固体識別より、queryで検索をかけてするのか、メールアドレスにより選別するのかなどで変わると思われます。
一番より方法は御座いませんか?
A 回答 (2件)
- 最新から表示
- 回答順に表示
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 文やコードは提示しないでおきます。
コード片だけでテーブルの構造をつきとめ、クエリを作ったとしても、結果を表示するのにはコードを理解して修正する必要がありますし。
正直、もとのアプリを作った会社にきちんと機能拡張について相談するのがよいかと思います。
結果的に解決に繋がるものにならなかったことをお詫びいたします。
詳しくご説明頂き有り難う御座います。
雰囲気的に分かりました。
>>「一般ユーザーが会員のプロフィールにアクセスしたときに連鎖している紹介人数を表示したい」ですと、かなり頻繁に求める必要があるので、"ただ動くだけのコード"で実装するのは無理があります。キャッシュしたり、ごまかしたり工夫して近似的に求める必要があります。
なるほど。。。
DBだけの操作ではやはり難しいのでしょうかね。。。
ちょっともう少し色々勉強してから再度トライしたいと思います。
有り難う御座いました。
No.1
- 回答日時:
誰が誰を紹介したかという記録を残す方法は、色々な形が考えられますが、それがどう設計されているのかわからないと答えようがないです。
現在どのようなデータがあるのか、データベースのテーブルの構造はどうなっているのか。もしかしたら、直接データベースに問い合わせなくてもそれを知るようなメソッドが用意されているかもしれません。
さすがですね。。。
管理画面はパソコンで行っているのですがパソコンでは見れます。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelマクロ 差分抽出の方法が知りたいです。 2 2023/03/07 13:25
- 婚活 よく結婚相手を知人の紹介からなんて話聞きますが紹介してあげるとか一緒に飲みに行こうとか言われても大抵 2 2022/11/19 21:17
- 病院・検査 紹介先の病院からの受け取った検査結果書類について。 3 2023/05/22 08:02
- 中学校 現在教育実習中です。 担当教科は英語で担当学年は中学3年生です。 来週から授業を担当しますが 指導教 2 2023/06/06 19:51
- 理学療法士・作業療法士・言語聴覚士 乳がんの治療方針の決定根拠について 1 2022/12/09 08:09
- 医療 労災と転院 1 2023/01/06 11:04
- 歴史学 渤海はロシア人の国? 5 2022/05/15 22:24
- 学校 幽霊部員 変な目で見られるかも・・・ 2 2022/04/14 16:10
- 理学療法士・作業療法士・言語聴覚士 紹介された乳がんの治療をする病院を変えたい❗️ 3 2022/12/12 00:59
- その他(病気・怪我・症状) 長文です。何科に行けば良いのでしょうか。 20代前半。 10年近く全身の関節痛と、繰り返す微熱に悩ん 3 2023/04/22 23:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
VIEWの元のテーブルのindexって...
-
insertを高速化させたい
-
副問合せの書き方について
-
SQL Left Join で重複を排除す...
-
ある条件の最大値+1を初番する...
-
selectした大量データをinsert...
-
マイクラPC版のコマンドで効率...
-
select文のwhere句に配列を入れ...
-
一つ前のレコードの値と減算し...
-
my_itemsテーブルのIDにAUTO_IN...
-
期間の重複を調べるSQL文につい...
-
1対多結合で多を絞り込み条件と...
-
SELECT~LIKE~の結果が変
-
1テーブル&複数レコードの更新...
-
MySQLにてCOUNTした値を更にCOUNT
-
エクセルの関数について教えて...
-
Unionした最後にGROUP BYを追加...
-
SQLサーバから、項目の属性(型...
-
バインド変数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
VIEWの元のテーブルのindexって...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
副問合せの書き方について
-
マイクラPC版のコマンドで効率...
-
Unionした最後にGROUP BYを追加...
-
selectした大量データをinsert...
-
SQLにて特定の文字を除いた検索...
-
[SQLServer] テーブル名からカ...
-
1テーブル&複数レコードの更新...
-
inner joinをすると数がおかし...
-
クエリ表示と、ADOで抽出したレ...
-
ある条件の最大値+1を初番する...
-
sqlで、600行あるテーブルを100...
-
複数テーブルのGROUP BY の使い...
-
insertを高速化させたい
-
PL/SQLの変数について
-
キー毎の、ある列のmaxのレコー...
おすすめ情報