プロが教える店舗&オフィスのセキュリティ対策術

http://okwave.jp/qa4191021.html
こちらで質問させていただきましたが、新しく解決できない問題ができたので、再度別の質問を立てさせていただきます。

現在、以下のUNIONを入れ子になったSELECT文があります。
-----------------------------------------------------
SELECT sum( p ) , count( * ) +1 AS jyuni
FROM
(
SELECT ad_kahi AS kahi, ad_mid AS mid, ad_r AS r, ad_p AS p
FROM ad_log
UNION ALL
SELECT g_kahi AS kahi, g_mid AS mid, g_r AS r, g_p AS p
FROM game_log
UNION ALL
SELECT b_kahi AS kahi, b_mid AS mid, b_r AS r, b_p AS p
FROM bazz_log
)
WHERE kahi = '0'
GROUP BY mid
HAVING sum( p ) > 0
------------------------------------------------
しかし、MySQLのバージョンの問題(MySQL 4.0.26)で、サブクエリを使うことができません。

そこで、同じ処理を副問合せを使わない形でできるようにする方法をご存知の方、いらっしゃいましたらご教示頂ければ幸いでございます。

ちなみに、一時テーブルを作る方法は考えました。
しかし、このスクリプトはWEBアプリの一部で実行・更新頻度が多く、多いときは1回につき数万行を処理することになるという事情がありまして、できるだけ軽く処理ができる方法が他にあればと考えております。

何卒よろしくお願い申し上げます。

A 回答 (3件)

>→現状はまだデータ未登録の状態です。



もしそうなら、1つのテーブルで管理するように構造をかえればすむのでは?

データの種別を記録するフィールドを1個つくれば、3つテーブルがある
のとおなじような効果は得られますし
    • good
    • 0
この回答へのお礼

御礼遅くなってしまい申し訳ありません。

>もしそうなら、1つのテーブルで管理するように構造をかえればすむのでは?
実際のテーブルはもっとカラムが多く複雑なため、あえてテーブルを分けて設計しております。

結局、もう1つの一時テーブルにそれぞれの集計値を書き出してから集計するようにしました。

ありがとうございました。

お礼日時:2008/07/31 21:57

一時テーブルを使うしかないでしょうから・・・


(1)3回集計してそれぞれを一時テーブルにinsertしておき、その結果を
もう一度集計する
(2)集計せずに一時テーブルにinsertしてしまい、一度だけ集計する

の両方テストして、早いほうを採用するというのが妥当かと。
    • good
    • 0

継続した質問は、ここでは「前の質問を締めてから行う」のがルールですよ?



>ちなみに、一時テーブルを作る方法は考えました。
>実行・更新頻度が多く、多いときは1回につき数万行を処理することになるという
>事情がありまして、できるだけ軽く処理ができる方法が他にあれば

提示されたSQLは、「3表の全行をunionする」という操作で、元々、軽く処理できる
SQLになっていませんが?

母体データは何件くらいですか?
どの列が、頻繁に更新されるのですか?
どういうインデクスを付けていますか?
    • good
    • 0
この回答へのお礼

ご回答いただきまして、誠にありがとうございます。

>継続した質問は、ここでは「前の質問を締めてから行う」のがルールですよ?
→ご指摘ありがとうございます。

>提示されたSQLは、「3表の全行をunionする」という操作で、元々、軽く処理できるSQLになっていませんが?
→仰るとおり、そもそも重い処理です。
私の力量不足で一時テーブルを使う方法しか考え付かなかったため何かよい代替案がないものかと考え質問させていただきました。

>母体データは何件くらいですか?
>どの列が、頻繁に更新されるのですか?
→現状はまだデータ未登録の状態です。
更新と書いてしまいましたが、updateよりもinsertでの新規登録が主です。どの列にもデータは入ります。
3テーブルあわせて毎月3万件前後の新規登録があります。
上記SELECT文ではシンプルにするため省きましたが、今月分のみ抽出するよう条件付けます。毎月3万件を複数月分まとめて処理はしない予定です。

>どういうインデクスを付けていますか?
→インデクスについて調べはしたのですが、DBに冠する知識が圧倒的に不足しているため、まだどうつければいいのか放置している状態です。
全く初歩的な理解が足りない中なのですが、mid=会員ID、r=更新日時、 p=ポイントですが、group byなどするのは会員IDが多いため、midになるのかと考えています。

初歩的なレベルでわかりにくい質問にお答えいただきありがとうございます。

お礼日時:2008/07/22 00:56

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

関連するカテゴリからQ&Aを探す