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

締切り済みの質問

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;
}
}

投稿日時 - 2010-01-17 19:43:17

QNo.5600670

困ってます

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

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

回答(2)

ANo.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;

投稿日時 - 2010-01-18 11:58:04

ANo.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);

など。

投稿日時 - 2010-01-18 00:10:12

あなたにオススメの質問