- ベストアンサー
PHPでMySQL内のデータの合計値を算出する方法
- PHPからMySQL5を呼出すスクリプトを制作しています。以下のようなデータがありますが、idが2番で現在から1ヵ月前の期間内のpriceの合計額を算出したいです。SQLおよび変数の使い方が分からず、結果を返すことができません。
- idが2番で現在から1ヵ月前の期間内のpriceの合計額を算出するために、PHPからMySQL5を呼出すスクリプトを制作しています。しかし、SQL文やPHPの変数の使い方がわからず、結果を返すことができません。
- PHPでMySQL5内のデータの合計値を算出したいです。具体的には、idが2番で現在から1ヵ月前の期間内のpriceの合計額を算出したいですが、SQL文やPHPの変数の使い方がわからずに困っています。アドバイスを頂けると助かります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
ごめんなさいタイポです × inteval ○ interval
その他の回答 (4)
- yambejp
- ベストアンサー率51% (3827/7415)
>定義の書き方(置き方)が分かりません まずMySQLにおける現在=本日はCURDATE()で得られます 「現在から1ヵ月前の期間」というのは実はあいまいで 考え方の一つとしては、「1カ月前の1日後から今日まで」というのが一般的です たとえば今日が2013年6月4日なら1か月前=5/4の1日後=5/5から6/4がそれにあたります。 月の長さは一定ではないので考え方が微妙です 仮に5/31の1カ月前をとるときMySQLでは4/30を返します。 これは5/30の1カ月前とっても同じ4/30がかえってくるので想定した期間と ことなる可能性があります。 同様に4/30の1カ月前は3/30ですから、4月のデータを集計しようとして 4/30から1カ月さかのぼろうとしても3/31のデータを拾ってしまうケースが あるということです。 そういった例外処理むししていいなら、前述した1カ月前の1日後から当日までを 集計期間として、以下のようなSQLを発行します select id, sum(price) from テーブル名 where id = 2 and `date` between curdate() - inteval 1 month + inteval 1 day and curdate()
お礼
yambejpさま ご丁寧にご説明頂き有難うございます! 回答を拝見し、かれこれ3時間ほど(恥)色々と試していますが、構文エラーとなっているようで結果を求めることが出来ません。 以下のスクリプトが実際に試している内容ですが、何処か不適切な個所はありますでしょうか? また、結果を返すための変数などもお教え頂けると幸いです。 $con = mysql_connect("localhost", "***", "******"); mysql_select_db("***", $con); $sql = "SET NAMES ujis"; mysql_query($sql); $sql = "SELECT id, SUM(price) FROM sales WHERE id = '2' AND `date` between curdate() - inteval 1 month + inteval 1 day AND curdate()"; $result = mysql_query($sql); $rows = mysql_num_rows($result) or die("error");
- maiko0318
- ベストアンサー率21% (1483/6969)
>WHERE id = 2 AND DATETIME BETWEEN #2013-5-1# AND #2013-5-31# SELECTで書くのはカラム名であって、データ型とは違います。 DATETIME型の記述はやったことがありませんm(__)m >結果を返すための変数 PHPはわからないのですが、SELECTで返ってくるのはDATETIME型です。
お礼
maiko0318さま ご丁寧なご対応、ありがとうございます。
補足
maiko0318さま こんばんは。お世話になっております。 先のお返事、お礼が疎かになっていました。 前回に続けての貴重なアドバイス、感謝しています。 ありがとうございました!
- yambejp
- ベストアンサー率51% (3827/7415)
>現在から1ヵ月前の期間内 1か月の定義次第ですね `date` between curdate() - inteval 1 month + inteval 1 day and curdate()
お礼
>yambejpさま こんばんは。ご親切なアドバイスをありがとうございます。 yambejpさまが仰っている定義の書き方(置き方)が分かりませんが、どのような記述となるのでしょうか? 引続き、アドバイス頂ければ幸いです。
- maiko0318
- ベストアンサー率21% (1483/6969)
SELECT id SUM(PRICE) FROM テーブル名 WHERE id = 2 AND DATE BETWEEN #2013-5-1# AND #2013-5-31# 日付のところは必要に応じて変数にしてください。
お礼
>maiko0318さま こんばんは。前回に引き続き有難うございます。 早速とばかり試してみましたが、エラーとなってしまいます。 質問時、文字数を省略するため、dateカラムをdate型で書きましたが、実際はdatetime型なので、 SELECT id SUM(PRICE) FROM テーブル名 WHERE id = 2 AND DATETIME BETWEEN #2013-5-1# AND #2013-5-31# としましたが、この認識で宜しかったでしょうか? また、#2013-5-1# AND #2013-5-31# の部分ですが、シャープを記述するのは初めて見ましたが、シングルコーテーションと同様の使い方になるのでしょうか? それと、結果を返すための変数はどのようなものになりますでしょうか? お恥ずかしい質問ばかりで恐縮ですが、引続きご指導頂ければ幸いです。
補足
$sql = "SELECT id SUM(PRICE) FROM テーブル名 WHERE id = 2 AND DATETIME BETWEEN '2013-5-1' AND '2013-5-31'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); というスクリプトとなっています。 結果を返すための変数もお教え頂けると幸いです。。 (テーブル名は実際の名称)
お礼
yambejpさま こんばんは。お世話になっております。 早速のお返事をありがとうございます。 検索していれば気付いても良いようなもの・・お恥ずかしい。恐縮です。 とはいえ、無事、描いていた結果を求めることが出来ました! また、初めてみる構文でとても勉強になりました。 ありがとうございました!