こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

今日から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);

****全レコードが出てきます。

何か見当違いな事をしているのでしょうか?
色々やっていますがうまく行きません。

ご教授、お願いいたします。

投稿日時 - 2009-03-22 18:36:55

QNo.4818455

すぐに回答ほしいです

質問者が選んだベストアンサー

>専門家だと思うのですが、

いえ、ただの一般人で、文系ですし、本職は営業系の仕事です。

>PHP Mysql を自在に操れるようになる

一介の素人の私がうんちくを語るのはおこがましいので、
申し上げることもあまりありませんが、ただ、こんな私でも書ける
のですから、普通に誰でもかけると思いますよ。

なんにせよまちがいを気にせず書いてみることです。
あとは、チューニングするためのフローに気がつけば、
それなりのプログラムになるでしょう・・・

たとえばこの板の質問だけみて書いてみて、他人の回答と
自分の答えがどう違うか見比べるだけでも他人の考え方が
盗めそうです。

投稿日時 - 2009-03-23 21:45:14

お礼

アドバイス、ありがとうございました。

ずっと、yambejp さんから教えていただいて、
考えて、自分なりの方法でやってみたり。
うまく行かなくても、トライアンドエラーで随分根気良く考えられるようになりました。

最近は困ったことが無くてもこの板は見るようにしていますし、
答えようかな?と思う事があったり(自信が無いのでこの板では回答したことないですが。)

とにかくいつも勇気をもらっています!
いつもありがとうございます。

投稿日時 - 2009-03-23 22:59:05

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

ではためしに・・・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

とかでどうでしょ?

投稿日時 - 2009-03-23 15:18:56

補足

yambejp 様

いつもありがとうございます。

今も1時間ほど、ソースを頭の中で理解しようと(^^♪

参考書には [INNER JOIN] なども載っていますが、
このように使うとは、思いも付きませんでした。

現在、頭の中では理解いたしました!

以前から教えていただいていますが、
少しは以前より出来ることが増えてきました。

yambejp 様 は多分専門家だと思うのですが、
専門的な教育を受けていない私が、もう少しPHP Mysql を自在に操れるようになるには
どうしたらいいでしょうか?

現在はPHP Mysql の本を山ほど読んで、必要なことはネットで調べてと
ばらばらに学んでいっています。(体系的ではなく)
もしよろしければ、アドバイスをお願いいたします。

投稿日時 - 2009-03-23 17:14:47

ANo.2

そのままSQLだけでやると結構面倒そうですね。
ストアードプロシージャやらなにやらつかったり・・・
それでもチューニングが面倒だったりいろいろ問題がありそうです。

おもいきって誕生日管理用にテーブルを一つ用意してみてはどうでしょう?
項目としては1900年から2100年あたりまで連番でとっておいて、
その月日をもっているだけでよいかと思います。
それを絡めれば低レベルのSQLでJOINするだけで処理ができそうです

投稿日時 - 2009-03-23 12:14:49

補足

いつもご教授ありがとうございます。

>誕生日管理用にテーブルを一つ用意
すみません、どのような物を作れば良いのか全くわかりません。

お手数ですが、もう少しアドバイスをお願いいたします

この方法でダメなら、同じテーブル内で
yyyy mm dd を yyyy mmdd と2つのフィールドに分けて
何とかやろうと考えていました。

投稿日時 - 2009-03-23 13:09:15

ANo.1

$sql="SELECT * FROM member WHERE birthday BETWEEN '$from' AND (CURDATE() + INTERVAL 7 DAY)";
これでできませんかね?
$from変数に'(シングルクオーテション)がついてないからだと思います。

投稿日時 - 2009-03-22 19:57:16

補足

早々にアドバイスありがとうございました。
構文はそれで正しかったと判りました。m(__)m
(シングルクオーテション)

ソースをコピーして、そのまま使わせていただきましたが、
今度は1件もヒットしませんでした。

もしかしてと思い、2009-03-25 にするとヒットしました。

月日だけで BETWEEN を使うのは間違っているのでしょうか?

若しくは、月日だけでフィールドを別途用意しないとダメでしょうか?
**そうすると、年をまたいだ時にどうなるかとか、また考えないといけないかもと思い。
**このようにしてみたのですが。

投稿日時 - 2009-03-22 20:33:08

あなたにオススメの質問