• ベストアンサー

複数テーブルを合わせて総合ランキングを作りたいです

以下の2つの相性テーブル(table_a,table_b)でサブクエリーを使わず期待する結果(ランキング)を得るSQLはあるでしょうか? 又、両方とも1万件になった場合結構重いでしょうか?うーん、1つのテーブルにした方が良いですか。。 ■table_a user match_user point test1 test2 2 test1 test3 2 ■table_b user_id match_user_id point test1 test2 2 test1 test3 4 ■期待する結果 総合マッチランキング 1. test3 (6point) 2. test2 (4point)

質問者が選んだベストアンサー

  • ベストアンサー
  • mickymac
  • ベストアンサー率37% (90/240)
回答No.3

こういうケースはTEMPORARYテーブルを使うのが結果楽だと思います。 まず、 CREATE TEMPORARY TABLE teble_c AS (SELECT match_user, point FROM table_a WHERE user = 'test1') UNION ALL (SELECT match_user_id AS match_user, point FROM table_b WHERE user_id = 'test1'); でtable_cを作成し、続けて SELECT match_user, sum(point) AS point FROM table_c GROUP BY match_user ORDER BY point DESC; でどうでしょうか。TEMPORARYテーブルはセッションごとに作成 されますので、結構便利に使えます。

php4
質問者

お礼

なるほど。TEMPORARYテーブルの事をすっかり忘れておりました。 特に制約事項もないようです。最高のご回答ありがとうございます!

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>サブクエリーを使わず の根拠を示したほうがよいでしょう。 見た感じもっとも手っ取り早いのは各テーブルで集計後 テンポラリに流し込んで、再集計でしょうか。 (単純にポイントを足すだけなら・・・) この場合テーブルは1つにしたほうがよいかもしれませんね。 今回は例がわるいのでもう少しわかりやすく分類した 例示があるとよいとおもいます

php4
質問者

お礼

サブクエリーですか。。レンタルサーバーがMySQL4.0 なので使えないのです(T_T) サブクエリーを使わないと重たい処理になるケースは多いでしょうか? 例が悪くてすみません。補足を書きました。 問題点としては、 お気に入りのように項目を登録する方式なので 項目毎に必ずしもユーザーのレコードがあるとは 限らず、今のところ下記のように集計しています。。 ・A項目にデータがあるユーザー ↓ table_a からユーザーのレコードを全て削除 ↓ table_a に集計結果をInsert ・B項目にデータがあるユーザー ↓ table_b からユーザーのレコードを全て削除 ↓ table_b に集計結果をInsert レコード(画面表示)例: test3 6 test2 4 test4 2 test5 1 test6 1

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

どのような目的なのかはわかりませんので、一つのテーブルにしたほうがいいかは分かりません。 一つにできるものならばしたほうが集計は早いです。 一万件程度だったらそれほど重くはならないでしょう。 ・同じ match_user/match_use_id の point を足せばいいのか(user/user_idは影響しないのか?) ・match_user/match_use_idが重複するかしないか によって若干書き方が違ってきます。

php4
質問者

補足

回答ありがとうございます。 目的は、数多くの項目があり、ユーザーは その中から好きな項目を登録していきます。 好きな項目が同じであれば相性があがります。 好きな項目毎に相性ポイントをユーザーが自由に 設定できる仕様にしたいです。 毎回、DBを読んで集計すると重たいので、 バッチ処理で集計だけは1日1回行おうと考えました。 集計方法は同じ match_user/match_use_id の point を足せば良く、WHERE user_id = '1'というようにuser_id単位で抽出できればOKです。 match_user/match_use_idが重複することはありません。