アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下の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)

A 回答 (3件)

どのような目的なのかはわかりませんので、一つのテーブルにしたほうがいいかは分かりません。


一つにできるものならばしたほうが集計は早いです。
一万件程度だったらそれほど重くはならないでしょう。

・同じ match_user/match_use_id の point を足せばいいのか(user/user_idは影響しないのか?)
・match_user/match_use_idが重複するかしないか

によって若干書き方が違ってきます。

この回答への補足

回答ありがとうございます。

目的は、数多くの項目があり、ユーザーは
その中から好きな項目を登録していきます。
好きな項目が同じであれば相性があがります。
好きな項目毎に相性ポイントをユーザーが自由に
設定できる仕様にしたいです。

毎回、DBを読んで集計すると重たいので、
バッチ処理で集計だけは1日1回行おうと考えました。

集計方法は同じ match_user/match_use_id の point を足せば良く、WHERE user_id = '1'というようにuser_id単位で抽出できればOKです。

match_user/match_use_idが重複することはありません。

補足日時:2006/10/06 11:29
    • good
    • 0

>サブクエリーを使わず



の根拠を示したほうがよいでしょう。
見た感じもっとも手っ取り早いのは各テーブルで集計後
テンポラリに流し込んで、再集計でしょうか。
(単純にポイントを足すだけなら・・・)

この場合テーブルは1つにしたほうがよいかもしれませんね。

今回は例がわるいのでもう少しわかりやすく分類した
例示があるとよいとおもいます
    • good
    • 0
この回答へのお礼

サブクエリーですか。。レンタルサーバーが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

お礼日時:2006/10/06 14:47

こういうケースは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テーブルはセッションごとに作成
されますので、結構便利に使えます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/09 12:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!