- ベストアンサー
今日から7日分の誕生日を抽出したい
いつもお力を借りています、すみません。 [mysql 5.1.22-rc] [PHP 5.2.5] で、運用しています。 テーブルは[member] で抽出したいフィールドは [birthday]で date型で[1978-12-26] の様に入れています、 そのデータの中から、今日から一週間以内に誕生日の来る方にメールを出そうとしていますが 抽出が出来ません。 今やってみたのは $from = date('Y-m-d'); $sql="SELECT * FROM member WHERE birthday BETWEEN $from AND (CURDATE() + INTERVAL 7 DAY)"; $rst = mysql_query($sql, $con); ****全レコードが出てきます。 何か見当違いな事をしているのでしょうか? 色々やっていますがうまく行きません。 ご教授、お願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>専門家だと思うのですが、 いえ、ただの一般人で、文系ですし、本職は営業系の仕事です。 >PHP Mysql を自在に操れるようになる 一介の素人の私がうんちくを語るのはおこがましいので、 申し上げることもあまりありませんが、ただ、こんな私でも書ける のですから、普通に誰でもかけると思いますよ。 なんにせよまちがいを気にせず書いてみることです。 あとは、チューニングするためのフローに気がつけば、 それなりのプログラムになるでしょう・・・ たとえばこの板の質問だけみて書いてみて、他人の回答と 自分の答えがどう違うか見比べるだけでも他人の考え方が 盗めそうです。
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
ではためしに・・・calendarといテーブルをつくります。 フィールドはdate型のd_dateを主キーとして、 char型で月と日をいれたc_mdを作り、indexを貼っておきます。 このテーブルに1900-01-01から2100-01-01まで ('1900-01-01','0101')、('1900-01-02','0102')・・・ というデータをあらかじめ仕込んどきます。 SELECT * FROM member INNER JOIN ( SELECT calendar.d_date FROM calendar INNER JOIN (SELECT c_md FROM calendar WHERE d_date between curdate() and curdate()+ INTERVAL 6 DAY ) AS cal2 ON calendar.c_md = cal2.c_md ) AS cal3 ON cal3.d_date=birthday とかでどうでしょ?
補足
yambejp 様 いつもありがとうございます。 今も1時間ほど、ソースを頭の中で理解しようと(^^♪ 参考書には [INNER JOIN] なども載っていますが、 このように使うとは、思いも付きませんでした。 現在、頭の中では理解いたしました! 以前から教えていただいていますが、 少しは以前より出来ることが増えてきました。 yambejp 様 は多分専門家だと思うのですが、 専門的な教育を受けていない私が、もう少しPHP Mysql を自在に操れるようになるには どうしたらいいでしょうか? 現在はPHP Mysql の本を山ほど読んで、必要なことはネットで調べてと ばらばらに学んでいっています。(体系的ではなく) もしよろしければ、アドバイスをお願いいたします。
- yambejp
- ベストアンサー率51% (3827/7415)
そのままSQLだけでやると結構面倒そうですね。 ストアードプロシージャやらなにやらつかったり・・・ それでもチューニングが面倒だったりいろいろ問題がありそうです。 おもいきって誕生日管理用にテーブルを一つ用意してみてはどうでしょう? 項目としては1900年から2100年あたりまで連番でとっておいて、 その月日をもっているだけでよいかと思います。 それを絡めれば低レベルのSQLでJOINするだけで処理ができそうです
補足
いつもご教授ありがとうございます。 >誕生日管理用にテーブルを一つ用意 すみません、どのような物を作れば良いのか全くわかりません。 お手数ですが、もう少しアドバイスをお願いいたします この方法でダメなら、同じテーブル内で yyyy mm dd を yyyy mmdd と2つのフィールドに分けて 何とかやろうと考えていました。
- calltella
- ベストアンサー率49% (317/635)
$sql="SELECT * FROM member WHERE birthday BETWEEN '$from' AND (CURDATE() + INTERVAL 7 DAY)"; これでできませんかね? $from変数に'(シングルクオーテション)がついてないからだと思います。
補足
早々にアドバイスありがとうございました。 構文はそれで正しかったと判りました。m(__)m (シングルクオーテション) ソースをコピーして、そのまま使わせていただきましたが、 今度は1件もヒットしませんでした。 もしかしてと思い、2009-03-25 にするとヒットしました。 月日だけで BETWEEN を使うのは間違っているのでしょうか? 若しくは、月日だけでフィールドを別途用意しないとダメでしょうか? **そうすると、年をまたいだ時にどうなるかとか、また考えないといけないかもと思い。 **このようにしてみたのですが。
お礼
アドバイス、ありがとうございました。 ずっと、yambejp さんから教えていただいて、 考えて、自分なりの方法でやってみたり。 うまく行かなくても、トライアンドエラーで随分根気良く考えられるようになりました。 最近は困ったことが無くてもこの板は見るようにしていますし、 答えようかな?と思う事があったり(自信が無いのでこの板では回答したことないですが。) とにかくいつも勇気をもらっています! いつもありがとうございます。