人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP×MYSQLでselect文がわからないためご教授願います。

SELECT * FROM tableA WHERE code = 7
というSQLで以下のように表示されるのですが、
例)
id , code , name , date , 売上
1 , 7 , りんご , 2010-01-12 , 350
1 , 7 , りんご , 2010-01-07 , 250
2 , 7 , みかん , 2010-01-12 , 450
2 , 7 , みかん , 2009-05-05 , 550

それを、売上があった日の1営業日後と3営業日後のそれぞれのidの価格も取得したいと考えております。
例)
id , code , name , date , 売上 , 1営業日後売上 , 3営業日後売上
1 , 7 , りんご , 2010-01-12 , 350 , 200 , 500
1 , 7 , りんご , 2010-01-07 , 250 , 200 , 250
2 , 7 , みかん , 2010-01-10 , 450 , 500 , 300
2 , 7 , みかん , 2009-05-05 , 550 , 220 , 350

ちなみにdateはUNIXTIMEにてintでMYSQLに格納してあります。
1営業日後にしているのは、休日の関係で1日後とできないからです。

●質問者: dekapurio
●カテゴリ:ウェブ制作
✍キーワード:2009-05-05 2010-01-07 MySQL name PHP
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● km1967
●5ポイント

まずはお願いなのですが、

「営業日」の定義が土日以外ではなく定休日や祝祭日も含むかどうか

わらないと回答することは難しくなりますので、必須だとご記憶ください。

不適当な回答が集まっても混乱をきたしますから、私への返信欄か、

あるいは、コメント欄を開く設定に変更してコメント欄)に、

書き加えておくことを勧めます。

◎質問者からの返答

情報不足で申し訳ないです。

>>「営業日」の定義が土日以外ではなく定休日や祝祭日も含むかどうか

実際のデータは株式市場を前提としているため、「土日と祝祭日以外」ということになります。

また、MYSQL 5.1 PHP 5.2という環境です。


2 ● km1967
●2ポイント

>実際のデータは株式市場を前提としているため

それだと、12月31日や1月2・3日も除く必要があるのではないですか?


いずれにしても休日テーブルを別途設ける必要がありますが、MySQL側のデータ型を変更できないのでは、どうにもなりませんね。

◎質問者からの返答

>>12月31日や1月2・3日も除く必要があるのではないですか?

そうですね。年末年始も市場は開いてませんでした^^;

ただ、株式市場が開いて無い日はデータ自体も無いので、

1営業日後のデータがほしい場合、

id , code , name , date , 売上

1 , 7 , りんご , 1263222000 , 350

の「1263222000」の数値より大きく、一番近いデータの売上の数値がわかればいいのですが。

同じように、該当日より大きく、一番近いデータを5件取得できれば、1営業日?5営業日までの数値も取得できるというイメージです。

厳しいですかね?


3 ● kn1967
●43ポイント ベストアンサー

SQLの組み方は他のテーブルとの絡みがあるので、これが適しているとまでは申せませんが、

サブクエリを使った簡素な例を投稿させていただきます。

http://dev.mysql.com/doc/refman/5.1/ja/scalar-subqueries.html

SELECT T1.id, T1.code, T1.name, T1.date, T1.売上
 ,(SELECT 売上 FROM tableA T2
 WHERE T2.id = T1.id AND T2.code = T1.code AND T2.date > T1.date
 ORDER BY date LIMIT 1,1
 ) AS 1営業日後売上
 ,(SELECT 売上 FROM tableA T3
 WHERE T2.id = T1.id AND T2.code = T1.code AND T2.date > T1.date
 ORDER BY date LIMIT 3,1
 ) AS 3営業日後売上
FROM tableA T1
WHERE T1.code = 7
;

※ id + code + dateでレコードがユニーク(レコードを特定できる)だと仮定。

※ スミマセンが動作確認はせず、いきなり書いてます。

はてなに対する熱意が無くなって久しいのですが、久方ぶりに覗いて見ると、

あいも変わらず私の使ったフレーズを使いまわして、回答を含まないどころか、

勝手に休日に拘った頓珍漢な投稿を繰り返しているコマッたちゃんが

出張っているようなので、ちょっと懲らしめたくなり一時的に復帰してきました(爆!)

◎質問者からの返答

返信どうも有り難うございます。

うまくいきました!

拙い文章にもかかわらず理解して頂き感謝しています。


4 ● kn1967
●40ポイント

書き方はいろいろあるけど、こんな感じ。

$sqlStr = 'SQLはここに書く';
if (!$result = mysql_query($sqlStr)) {
 echo 'SQLの実行失敗';
} else {
 $sum = array(0, 0, 0);
 echo '<table>';
 echo '<th>id</th><th>code</th><th>name</th><th>date</th><th>売上</th><th>1営業日後売上</th><th>3営業日後売上 </th>';
 while($row = mysql_fetch_row($result)){
 echo '<tr>';
 echo '<td>' . $row[0] . '</td>';
 echo '<td>' . $row[1] . '</td>';
 echo '<td>' . $row[2] . '</td>';
 echo '<td>' . $row[3] . '</td>';
 echo '<td>' . $row[4] . '</td>';
 echo '<td>' . $row[5] . '</td>';
 echo '<td>' . $row[6] . '</td>';
 echo '</tr>';
 $sum[0] += $row[4];
 $sum[1] += $row[5];
 $sum[2] += $row[6];
 }
 echo '<tr>';
 echo '<td colospan="4">トータル</td>';
 echo '<td>' . $sum[0] . '</td>';
 echo '<td>' . $sum[1] . '</td>';
 echo '<td>' . $sum[2] . '</td>';
 echo '</tr>';
 echo '</table>';
}

※PostgreSQL中心のため、MySQLのほうの実行環境が今はなく、

今回もノーチェックで失礼します。

◎質問者からの返答

当方初心者ですが、すごくわかりやすく書いて頂いて感謝です。

わたしの場合、コードがぐちゃぐちゃで偶然出来てしまっただけなので、こちらに書き換えたいと思います。

  1. = とか 配列への入れ方などこれだけでも勉強になります。
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ