- ベストアンサー
副問合せを使わずにUNIONと同様の処理ができるように書き換えする方法
- MySQLのバージョンの問題で、UNIONを入れ子にしたSELECT文を副問合せを使わずに書き換える方法を教えてください。
- 一時テーブルを作る方法は考えましたが、処理が重くなるため、他に軽く処理ができる方法があれば教えてください。
- お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>→現状はまだデータ未登録の状態です。 もしそうなら、1つのテーブルで管理するように構造をかえればすむのでは? データの種別を記録するフィールドを1個つくれば、3つテーブルがある のとおなじような効果は得られますし
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
一時テーブルを使うしかないでしょうから・・・ (1)3回集計してそれぞれを一時テーブルにinsertしておき、その結果を もう一度集計する (2)集計せずに一時テーブルにinsertしてしまい、一度だけ集計する の両方テストして、早いほうを採用するというのが妥当かと。
- chukenkenkou
- ベストアンサー率43% (833/1926)
継続した質問は、ここでは「前の質問を締めてから行う」のがルールですよ? >ちなみに、一時テーブルを作る方法は考えました。 >実行・更新頻度が多く、多いときは1回につき数万行を処理することになるという >事情がありまして、できるだけ軽く処理ができる方法が他にあれば 提示されたSQLは、「3表の全行をunionする」という操作で、元々、軽く処理できる SQLになっていませんが? 母体データは何件くらいですか? どの列が、頻繁に更新されるのですか? どういうインデクスを付けていますか?
お礼
ご回答いただきまして、誠にありがとうございます。 >継続した質問は、ここでは「前の質問を締めてから行う」のがルールですよ? →ご指摘ありがとうございます。 >提示されたSQLは、「3表の全行をunionする」という操作で、元々、軽く処理できるSQLになっていませんが? →仰るとおり、そもそも重い処理です。 私の力量不足で一時テーブルを使う方法しか考え付かなかったため何かよい代替案がないものかと考え質問させていただきました。 >母体データは何件くらいですか? >どの列が、頻繁に更新されるのですか? →現状はまだデータ未登録の状態です。 更新と書いてしまいましたが、updateよりもinsertでの新規登録が主です。どの列にもデータは入ります。 3テーブルあわせて毎月3万件前後の新規登録があります。 上記SELECT文ではシンプルにするため省きましたが、今月分のみ抽出するよう条件付けます。毎月3万件を複数月分まとめて処理はしない予定です。 >どういうインデクスを付けていますか? →インデクスについて調べはしたのですが、DBに冠する知識が圧倒的に不足しているため、まだどうつければいいのか放置している状態です。 全く初歩的な理解が足りない中なのですが、mid=会員ID、r=更新日時、 p=ポイントですが、group byなどするのは会員IDが多いため、midになるのかと考えています。 初歩的なレベルでわかりにくい質問にお答えいただきありがとうございます。
お礼
御礼遅くなってしまい申し訳ありません。 >もしそうなら、1つのテーブルで管理するように構造をかえればすむのでは? 実際のテーブルはもっとカラムが多く複雑なため、あえてテーブルを分けて設計しております。 結局、もう1つの一時テーブルにそれぞれの集計値を書き出してから集計するようにしました。 ありがとうございました。