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

3テーブルよりを以下の条件で1つのSELECT文で抽出したいのですが可能でしょうか?
 ・C_TBLのDATEが2007のデータ〔SUBSTR(DATE,1,4)='2007'を使用?〕
 ・A_TBLのCORPがcorp1のデータ(あいまい検索)
 ・CORP(昇順)、DATE(降順)、ITEM(昇順)でソート
・表示カラムは、CORP・DATE・ITEM・SURYO・TANKAです
<<A_TBL>>   <<B_TBL>>         <<C_TBL>>
A  CORP    B  A  ITEM TANKA   C  A  B   DATE  SURYO
a01 corp11   b01 a02 item03 10   c01 a03 b06 2007-11-01 100
a02 corp13   b02 a03 item01 20   c02 a01 b03 2007-12-01 200
a03 corp11   b03 a01 item03 10   c03 a05 b04 2007-11-01 100
a04 corp05   b04 a05 item02 30   c04 a01 b05 2007-11-01 300
a05 corp13   b05 a01 item02 30   c05 a03 b06 2007-12-01 200
           b06 a03 item03 20   c06 a01 b05 2007-11-02 100
           b07 a01 item01 10   c07 a03 b02 2007-11-01 500

また、以下の条件で集計を1つのSELECT文で行えますか?
現在は、C_TBLとB_TBLで集計抽出し、A_TBLの対象データを抽出し、2つの配列より・・・
というロジックを組んでいます。
 ・C_TBLのDATEが2007のデータ〔SUBSTR(DATE,1,4)='2007'を使用?〕
 ・A_TBLのCORPがcorp1のデータ(あいまい検索)
 ・CORP(昇順)、DATE(降順)でソート ※DATEは年月のみです
 ・CORP、DATE(年月)毎で金額を集計〔SUM(C_TBL.SURYO*B_TBL.TANKA) AS KINGAKU〕
・表示カラムは、CORP・DATE・金額です

宜しくお願い致します。

A 回答 (2件)

前者が・・・


SELECT `CORP`,`DATE`,`ITEM`,`SURYO`,`TANKA`
FROM `C_TBL`
INNER JOIN `B_TBL` ON `B_TBL`.`B` = `C_TBL`.`B`
INNER JOIN `A_TBL` ON `A_TBL`.`A` = `C_TBL`.`A`
AND `A_TBL`.`CORP` REGEXP("corp1")
WHERE 1
AND `C_TBL`.`DATE` BETWEEN '2007-01-01' AND '2007-12-31'
ORDER BY `CORP` ASC,`DATE` DESC,`ITEM` ASC

後者が・・・
SELECT `CORP`,`DATE`,SUM(`SURYO`*`TANKA`) AS `KINGAKU`
FROM `C_TBL`
INNER JOIN `B_TBL` ON `B_TBL`.`B` = `C_TBL`.`B`
INNER JOIN `A_TBL` ON `A_TBL`.`A` = `C_TBL`.`A`
AND `A_TBL`.`CORP` REGEXP("corp1")
WHERE 1
AND `C_TBL`.`DATE` BETWEEN '2007-01-01' AND '2007-12-31'
GROUP BY `CORP`,`DATE`
ORDER BY `CORP` ASC,`DATE` DESC

なお、日付にSUBSTR()だとインデックスが無効になるはずなので
レンジ(BETWEEN)で指定しています
また、あいまい検索は正規表現(REGEXP())でやれますが、
これもインデックスが利かないのであまり有効ではないかもしれません
LIKE '%corp1%'でも同じです。前方一致もしくは後方一致なら
インデックスが有効です。

適切なインデックスをつければデータが多くてもスピードはあまり
落ちないで運用できそうですね
    • good
    • 0
この回答へのお礼

早速の御回答有難う御座います。
詳細な処理ですと、DATEの抽出条件は
 ・年月(2007-11)で抽出
 ・年だけ(2007)で抽出
 ・月(11)だけで抽出
の3パターンがあり、月だけのパターンがあるので統一してSUBSTRを使用していました。他によい方法があれば教えていただきたいのですが。
また、WHERE1を初めてみたのですが、WHEREと違うのでしょうか?少しネットで調べてみましたが、検索できませんでした。
宜しければご回答お願い致します。

お礼日時:2007/12/07 13:19

・年月(2007-11)で抽出


`DATE` BETWEEN '2007-11-01' AND '2007-11-30'
・年だけ(2007)で抽出
`DATE` BETWEEN '2007-01-01' AND '2007-12-31'
もしくは
YEAR(`DATE`)='2007'
・月(11)だけで抽出
MONTH(`DATE`)='11'

YEAR()やMONTH()でもインデックス自体はきくようです。
レンジの方がはやいような気がします

WHERE 1ってのは条件をすべてANDでつないで書くときのおまじないです
「ここからWHERE句ですよ」という宣言みたいなもんだと思ってください。
PHPなどのプログラムで条件を動的に設定するときなどにつかいます。
実際なにも条件を設定しなくてもWHERE 1(すなわちWHERE TRUE)で
すべての情報が検索されますのでプログラム処理がらくです。

(phpMyAdminではWHERE 1がデフォルトで表示されます)
    • good
    • 0
この回答へのお礼

抽出できましたし、勉強になりました。
丁寧な記述でわかり易く、有難う御座いました。

お礼日時:2007/12/07 16:52

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

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