• ベストアンサー

今日から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); ****全レコードが出てきます。 何か見当違いな事をしているのでしょうか? 色々やっていますがうまく行きません。 ご教授、お願いいたします。

  • MySQL
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>専門家だと思うのですが、 いえ、ただの一般人で、文系ですし、本職は営業系の仕事です。 >PHP Mysql を自在に操れるようになる 一介の素人の私がうんちくを語るのはおこがましいので、 申し上げることもあまりありませんが、ただ、こんな私でも書ける のですから、普通に誰でもかけると思いますよ。 なんにせよまちがいを気にせず書いてみることです。 あとは、チューニングするためのフローに気がつけば、 それなりのプログラムになるでしょう・・・ たとえばこの板の質問だけみて書いてみて、他人の回答と 自分の答えがどう違うか見比べるだけでも他人の考え方が 盗めそうです。

kiyomidesuyo
質問者

お礼

アドバイス、ありがとうございました。 ずっと、yambejp さんから教えていただいて、 考えて、自分なりの方法でやってみたり。 うまく行かなくても、トライアンドエラーで随分根気良く考えられるようになりました。 最近は困ったことが無くてもこの板は見るようにしていますし、 答えようかな?と思う事があったり(自信が無いのでこの板では回答したことないですが。) とにかくいつも勇気をもらっています! いつもありがとうございます。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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 とかでどうでしょ?

kiyomidesuyo
質問者

補足

yambejp 様 いつもありがとうございます。 今も1時間ほど、ソースを頭の中で理解しようと(^^♪ 参考書には [INNER JOIN] なども載っていますが、 このように使うとは、思いも付きませんでした。 現在、頭の中では理解いたしました! 以前から教えていただいていますが、 少しは以前より出来ることが増えてきました。 yambejp 様 は多分専門家だと思うのですが、 専門的な教育を受けていない私が、もう少しPHP Mysql を自在に操れるようになるには どうしたらいいでしょうか? 現在はPHP Mysql の本を山ほど読んで、必要なことはネットで調べてと ばらばらに学んでいっています。(体系的ではなく) もしよろしければ、アドバイスをお願いいたします。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

そのままSQLだけでやると結構面倒そうですね。 ストアードプロシージャやらなにやらつかったり・・・ それでもチューニングが面倒だったりいろいろ問題がありそうです。 おもいきって誕生日管理用にテーブルを一つ用意してみてはどうでしょう? 項目としては1900年から2100年あたりまで連番でとっておいて、 その月日をもっているだけでよいかと思います。 それを絡めれば低レベルのSQLでJOINするだけで処理ができそうです

kiyomidesuyo
質問者

補足

いつもご教授ありがとうございます。 >誕生日管理用にテーブルを一つ用意 すみません、どのような物を作れば良いのか全くわかりません。 お手数ですが、もう少しアドバイスをお願いいたします この方法でダメなら、同じテーブル内で yyyy mm dd を yyyy mmdd と2つのフィールドに分けて 何とかやろうと考えていました。

  • calltella
  • ベストアンサー率49% (317/635)
回答No.1

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

kiyomidesuyo
質問者

補足

早々にアドバイスありがとうございました。 構文はそれで正しかったと判りました。m(__)m (シングルクオーテション) ソースをコピーして、そのまま使わせていただきましたが、 今度は1件もヒットしませんでした。 もしかしてと思い、2009-03-25 にするとヒットしました。 月日だけで BETWEEN を使うのは間違っているのでしょうか? 若しくは、月日だけでフィールドを別途用意しないとダメでしょうか? **そうすると、年をまたいだ時にどうなるかとか、また考えないといけないかもと思い。 **このようにしてみたのですが。

関連するQ&A

  • mysql_num_rowを繰り返したい

    ラジオボタン選択肢アンケートのデータをMySQLのテーブルに入れて、 mysql_num_row()で各選択肢の件数を抽出したいのですが。 選択肢は1~5の数値(int型)でanテーブルに入っています。 for ($i = 1; $ <= 5; $++) { $rst = mysql_query("SELECT * FROM an WHERE field=$i", $con); $kotae.$i = mysql_num_row($rst); } このように書くと 1の選択肢の数しか返してきません。しかも、件数が間違って返ってくる。  文法が間違っているからだと思うのですが。上記のようなことをやりたいのです。  forを使わないでやると、 $rst = mysql_query("SELECT * FROM an WHERE field=1",$con); $kotae1 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=2",$con); $kotae2 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=3",$con); $kotae3 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=4",$con); $kotae4 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=5",$con); $kotae5 = mysql_num_rows($rst); です。  forを使って楽にやりたい場合はどうすればよいでしょうか 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • SELECT文で取り出したデータを文字列を別のtableのひとつのフィールドへ

    宜しくお願いいたします。 PHP5 Mysql5 で運用しています。 $sql = "SELECT * FROM member WHERE ****** $rst = mysql_query($sql, $con); で取り出して while($col = mysql_fetch_array($rst)) { print $col['mail']; } これで表示はさせられるのですが、 この出てきたデータを [ , ] で区切って全部一まとめにして。 次の画面で、別のテーブルの一つのフィールドに 全部入れたいのですが判りません。。 表示はさせられるのだから、それを一まとめにしては 出来るつもりでしたが。どうしても判りません。 どのようにしたらよろしいでしょうか? アドバイスなど、宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 会員制サイトで最終ログイン日を取得

    PHP4 Mysql4 で運営する会員制サイトで ログインしてきたIDで、日付を自動で取得したいのですが 的外れな事をしているのか? 出来ません。。。 トライアンドエラーで頑張って見たのですが、 どんどんおかしな方へ行っているみたいなので、質問させてください。 IDでログインした先のページを以下のようにしているのですが 日付が更新できません。 IDは varchar(5) で a001 b001 のようにアルファベットと数字になっています 更新日は reg_date で date にしています。 <?PHP require_once("auth.php"); require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql =" select * from member where id=$id";  $rst = mysql_query($sql, $con); $sql ="update member set reg_date =date() where id = $id"; $con = mysql_close($con); ?> 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 今週の日曜日から土曜日までの要素の抽出

    次のようなテーブルがあります。 info{ name varchar(50) release date } 今週の日曜日(6/21)から土曜日(6/27)までの要素を抽出するため 次のようなSQL文を実行しました。 SELECT name FROM info WHERE release BETWEEN DATE_SUB( DATE(NOW()), INTERVAL DATE_FORMAT(NOW(), '%W') DAY ) and DATE_ADD( DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY ) この構文でエラーがでてしまいます。 BETWEENのand前後の指定は間違っていないと思うのですが どこが悪いのかわかりません。 ご教授願います。

    • ベストアンサー
    • MySQL
  • WHERE文の中で、MYSQLにINSERTが出来ない。

    メールを指定した時間に送信しようとしています。 手順はMYSQLに送信したい時間とメールの色々を入れて、 CRONで現在時間を調べて、合致したものを送信する。 このような手順で実現しようとしていますが、 最初でつまずいています。 送信先メールアドレスを while で抽出しながら MYSQLへインサートするつもりですが 一度しかインサートしてくれません。 インサートのsqlを[print $sql;]で、表示したものをphpMyAdminで SQL を実行すると キチンと挿入できます。 **3回分まとめてSQL を実行してもうまく挿入できます。 前のページから送ったものは全て[print] で、思い通りの結果が表示します。 どなたか、ご教授お願いいたします。 $sql = "select count(*) as cnt from customer WHERE customerID IN (1,2,3,5,8)"; $rst = mysql_query($sql, $con); $col = mysql_fetch_array($rst); $tcnt = $col["cnt"]; mysql_free_result($rst); print $tcnt."通送信<br />"; $subject ="これはPOSTで送りました"; $honbun ="これはPOSTで送りました"; $from = '送信元メールアドレス'; $jikan = "これはPOSTで送りました"; $sql ="select * from customer WHERE customerID IN (1,2,3,5,8)"; $rst = mysql_query($sql, $con); while($col = mysql_fetch_array($rst)) { $customerID= $col['customerID']; $name = $col['name']; $mail = $col['mail']; i++ $sql = "INSERT INTO mail_queue_timer (timermailID,customerID, jikan ,sender , recipient ,headers, body ) VALUES ($timermailID, $customerID,$jikan , \"$from\" , \"$mail\" ,\"$subject\" , \"$honbun\" ) "; $rst = mysql_query($sql, $con); }

    • ベストアンサー
    • PHP
  • 1ヶ月以内に誕生日を迎える社員を表示する

    これから1ヶ月の間に誕生日を迎える社員を抽出して表示する データベースを作成してここ1ヶ月に誕生日を迎える社員を表示したいです。 12月05日 木村 12月21日 佐々木 01月02日 加藤 上記のように表示したいです。日付が12月6日になったら12月5日生まれの木村は消える。 テーブル名 shop name VARCHAR型 birth DATE型 name | birth ----------------- 田中|1992-11-15 吉田|1990-10-01 佐藤|1885-08-02 検索してみて似たようなものを真似してみたのですが、何も表示されない状態です。 -------------------------------------------------------------------- $stmt = $dbh -> query("SELECT * FROM shop WHERE birth BETWEEN curdate() - interval 1 month + interval 1 day AND curdate()"); while($row = $stmt -> fetch()){ print date('m月d日',strtotime($row['birth'])); print($row['name']); } -------------------------------------------------------------------- これはどのようにしたら抽出して表示できるでしょうか? ご存知の方いらっしゃいましたらご教示ください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • mysql_num_rowsを使わず、SQL文のCOUNT関数で件数を得たい

    以下のサンプルを実行すればうまくいくのですが、 $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql = "select * from mytable where number = 10"; $rst = mysql_query($sql, $con); $countnum = mysql_num_rows($rst); echo $countnum . "件のレコードがありました。<br>"; ◆実行結果: 10件のレコードがありました。 「10件のレコードがありました。」という一行の実行結果を得たい目的なら、 三行目を「$sql = "select count(*) from mytable where number = 10";」 みたいにCOUNT関数を使っても結果が得られそうに思います。 というかむしろ、その方がコードが短くて済みそうな気がするのですけど。 その場合、4~6行目のPHPコードはどのように記述したらいいでしょうか。 echo $rst; としても、変な文字列を返してきました。

    • ベストアンサー
    • PHP
  • トランザクションについて教えてください

    PHPとMysqlを利用しています。MySQL4.1.18です。 同じテーブルに2つ以上の値をINSERTする場合、 1つでもエラーがあればロールバックさせるということはできますでしょうか。 あらかじめ「id=1」の値を登録しておき、この場合1つめがエラーになるので 2つめも実行されないでほしいのですが、実行されてしまいます。 テーブルのタイプはInnoDBにしています。 どうぞよろしくお願いします。 以下を参考に作成しました。 http://oshiete.nikkeibp.co.jp/qa3065237.html $sql = "begin"; $rst = mysql_query($sql, $con); //1つめ $sql= "INSERT INTO T_test(id,name)values('1','山田')"; $rst = mysql_query($sql, $con); if(!$rst){$err="err";} //2つめ $sql= "INSERT INTO T_test(id,name)values('2','鈴木')"; $rst = mysql_query($sql, $con); if(!$rst){$err="err";} $sql = "commit"; $rst = mysql_query($sql, $con); if($err){ $sql = "rollback"; $rst = mysql_query($sql, $con); }

    • ベストアンサー
    • MySQL
  • カウントして抽出するsqlをまとめたい

    mysql初心者です。宜しくお願い致します。 PHP+Mysqlで以下のスクリプトを組んでいます。 変数aを一旦決めておき、カウント結果次第で変数aの値を広げるというものです。 これをSQL文一発にまとめたいのですが、可能でしょうか? mysqlのバージョンは5.1.34です。お詳しい方、ご教授お願い致します。 $a = 10; //仮に10 $query = "SELECT COUNT(*) AS cnt FROM mydb WHERE col_a BETWEEN ( 100 - $a ) AND ( 100 + $a ) AND col_b BETWEEN ( 100 - $a ) AND ( 100 + $a )"; $result = mysql_query($query); $row = mysql_fetch_array($result); if($row[cnt] < 10){$a = 20;} //件数が10件以下ならaの範囲を広げて結果取得 $query = "SELECT * FROM mydb WHERE col_a BETWEEN ( 100 - $a ) AND ( 100 + $a ) AND col_b BETWEEN ( 100 - $a ) AND ( 100 + $a )"; $result = mysql_query($query);

    • ベストアンサー
    • MySQL
  • mySQL文でわかりません。

    http://dev.mysql.com/doc/refman/4.1/ja/date-calculations.html のページを参考に生年月日カラムよりasにて年齢を出しています。 そこで以下のように年齢を求めたあとwhere句にて条件を絞ったことまでは 良かったのでですがさらにbetweenにて年齢、ここでは20以上30以下を 続けて処理を行いたいのですがerrorになります。 下記SQL分を一度に発行することは可能ですか? SELECT *, CURDATE(), (YEAR(CURDATE())-YEAR(BIR))- (RIGHT(CURDATE(),5)<RIGHT(BIR,5)) as AGE FROM MYDB where KABETU='A' and NAME='B' AGE BETWEEN 20 and 30

    • ベストアンサー
    • MySQL