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

お世話になっております。
PHPからMySQL5を呼出すスクリプトを制作しています。


no id   date   price
----------------------------
1  4  2013-4-29  2100
2  2  2013-5-1   3150
3  2  2013-5-31  4200
4  7  2013-6-1   2100
5  2  2013-6-2   1575
6  4  2013-6-2   8400

というようなデータがありますが、下記のように、2番のid、かつ現在から1ヵ月前の期間内のpriceの合計額を算出したいのですが、
SQLおよび変数はどのようなものになりますでしょうか?


id: 2 
total: 5775

ネットで調べながらSQL文などを色々と試していますが、PHPの変数をどのようにしていしたらいいのかが分からず、結果を返すことが出来ずに立ち止まっている状況です。

大変お恥ずかしい質問と認識しているところですが、アドバイスのほど頂戴出来れば幸いです。
宜しくお願い申し上げます。

A 回答 (5件)

SELECT id SUM(PRICE) FROM テーブル名


WHERE id = 2 AND DATE BETWEEN #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);

というスクリプトとなっています。
結果を返すための変数もお教え頂けると幸いです。。
(テーブル名は実際の名称)

補足日時:2013/06/03 22:24
    • good
    • 0
この回答へのお礼

>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# の部分ですが、シャープを記述するのは初めて見ましたが、シングルコーテーションと同様の使い方になるのでしょうか?

それと、結果を返すための変数はどのようなものになりますでしょうか?
お恥ずかしい質問ばかりで恐縮ですが、引続きご指導頂ければ幸いです。

お礼日時:2013/06/03 22:21

>現在から1ヵ月前の期間内



1か月の定義次第ですね

`date` between curdate() - inteval 1 month + inteval 1 day and curdate()
    • good
    • 0
この回答へのお礼

>yambejpさま

こんばんは。ご親切なアドバイスをありがとうございます。
yambejpさまが仰っている定義の書き方(置き方)が分かりませんが、どのような記述となるのでしょうか?
引続き、アドバイス頂ければ幸いです。

お礼日時:2013/06/03 22:21

>WHERE id = 2 AND DATETIME BETWEEN #2013-5-1# AND #2013-5-31#


SELECTで書くのはカラム名であって、データ型とは違います。
DATETIME型の記述はやったことがありませんm(__)m

>結果を返すための変数
PHPはわからないのですが、SELECTで返ってくるのはDATETIME型です。

この回答への補足

maiko0318さま

こんばんは。お世話になっております。

先のお返事、お礼が疎かになっていました。

前回に続けての貴重なアドバイス、感謝しています。

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

補足日時:2013/06/04 22:04
    • good
    • 0
この回答へのお礼

maiko0318さま

ご丁寧なご対応、ありがとうございます。

お礼日時:2013/06/04 18:59

>定義の書き方(置き方)が分かりません



まず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()
    • good
    • 0
この回答へのお礼

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");

お礼日時:2013/06/04 19:06

ごめんなさいタイポです



× inteval
○ interval
    • good
    • 0
この回答へのお礼

yambejpさま

こんばんは。お世話になっております。
早速のお返事をありがとうございます。

検索していれば気付いても良いようなもの・・お恥ずかしい。恐縮です。

とはいえ、無事、描いていた結果を求めることが出来ました!

また、初めてみる構文でとても勉強になりました。
ありがとうございました!

お礼日時:2013/06/04 22:03

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