• 締切済み

MySQL + PHP 同じテーブル内でのクエリについて

PHP+MySQL勉強中の初心者です。 PHP+MySQL環境でのクエリについて、以下の条件でのクエリ結果を求めたいのですが、上手くできませんので、質問させてください。 MySQLのテーブルは以下のようになっています。 date        no   name ---------------------------- 2009-12-10   15   takada 2009-12-15   10   hirooka 2009-12-18   13   wakada 2010-01-10   15   takada 2010-01-11   13   wakada ----------------------------- 出力させたいクエリは、前月データを元にno列をKEYとした重複チェックです。 前月データを全件出力し、当月データに同じnoがあった場合、当月日付を 表示させたいと思っています。 (PHPで希望する出力結果) date       no   name     date2 ---------------------------------------- 2009-12-10  15   takada   2010-01-10 2009-12-15  10   hirooka 2009-12-18  13   wakada   2010-01-11 ----------------------------------------- 以下のようなソースでは、1行のみの出力結果しか表示されず、 whileの使い方に問題があると思うのですが、どのように解決すれば良いのかが解りません。 どうか、解決策をよろしくお願いいたします。 $mysql->query("SELECT * FROM xxxx where date LIKE '$y-$m%'"); while($row = $mysql->fetch()){ $date = $row["date"]; $no = $row["no"]; $name = $row["name"]; $mysql->query("SELECT * FROM xxxx where upddate LIKE '$y2-$m2%' and no = '$no'"); while($row = $mysql->fetch()){ $date2 = $row["date"]; echo <<<EOT <td>$date</td> <td>$no</td> <td>$name</td> <td>$date2</td><tr> EOT; } }

みんなの回答

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

各月にnoのデータは必ず1個以下しかないのでしょうか? そうでなければだいぶ事情がかわってきますが・・・ それと#1さんも指摘していますがdate(フィールド名としてはセンスがない)は date型ですよね? とりあえずこんなSQLで・・・ select * from xxxx left join (select * from xxxx where `date` between DATE_FORMAT(curdate(),'%Y-%m-01') AND DATE_FORMAT(curdate(),'%Y-%m-01')+INTERVAL 1 MONTH - INTERVAL 1 DAY ) as sub using(`no`) where xxxx.`date` between DATE_FORMAT(curdate(),'%Y-%m-01') -INTERVAL 1 MONTH AND DATE_FORMAT(curdate(),'%Y-%m-01')- INTERVAL 1 DAY;

  • yuu_x
  • ベストアンサー率52% (106/202)
回答No.1

mysql_query('SET @LAST_MONTH := DATE_SUB(NOW(), INTERVAL DAYOFMONTH(NOW()) DAY);'); $query=<<<EOQ SELECT LAST.date, LAST.no, LAST.name, THIS.date AS date2 FROM xxxx AS LAST LEFT OUTER JOIN ( SELECT date, no, name FROM xxxx WHERE YEAR(NOW()) = YEAR(date) AND MONTH(NOW()) = MONTH(date) ) THIS ON LAST.name = THIS.name AND LAST.no = THIS.no WHERE YEAR(@LAST_MONTH) = YEAR(LAST.date) AND MONTH(@LAST_MONTH) = MONTH(LAST.date); EOQ; $result = mysql_query($query); ================================================================= 再度質問文を読み返したところ、日付が文字列型のようですので、 mysql_query('SET @LAST_MONTH := DATE_SUB(NOW(), INTERVAL DAYOFMONTH(NOW()) DAY);'); $query=<<<EOQ SELECT LAST.date, LAST.no, LAST.name, THIS.date AS date2 FROM xxxx AS LAST LEFT OUTER JOIN ( SELECT date, no, name FROM xxxx WHERE date LIKE DATE_FORMAT(now(), '%Y-%m-%%') ) THIS ON LAST.name = THIS.name AND LAST.no = THIS.no WHERE LAST.date LIKE DATE_FORMAT(@LAST_MONTH, '%Y-%m-%%'); EOQ; $result = mysql_query($query); など。