• ベストアンサー

テーブルの「実行時間」のカラムから一時間以内のデータだけ取り出したい

いつもお世話になっております。 今、一時間ごとに表示する文章を変えるプログラム(表示はindex.html)を作っているのですが、データベース(MySQL)からのデータの引っ張り方が分かりません。 実行時間をDATETIMEで定義しており、一番新しいデータだけを引っ張ってきて表示するということは出来ているのですが。 SELECT msg FROM mytable ORDER BY time desc LIMIT 1; としてあります。これはmy.cgiに記載してあります。 これをいじって、一時間以内にテーブルに登録されたデータをひっぱることってできますでしょうか? 宜しくお願いいたします。

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

  • ベストアンサー
回答No.1

select msg from mytable where time between subtime(now(),'01:00:00') and now() でいけるかな? ※試せる環境ないので間違ってたらすいません。

参考URL:
http://www.limy.org/program/db/mysql/mysql_operators.html
ao-man
質問者

お礼

早速の回答ありがとうございます。 この通り記述すると、エラーにはならないんですけどどこか違うところを参照しているようで・・・ subtimeというのはコマンドですか?自分の環境に合わせて変更すべき単語はどこでしょうか??

その他の回答 (7)

回答No.8

こんな感じでどうでしょう。 select msg from mytable where `time` between concat(substr(subtime(now(),'1:00:00'),1,13),':00:00') and now();

ao-man
質問者

お礼

やってみたらできましたー。 ありがとうございます!

回答No.7

現在時刻を元に日付を加工して now()に代わるものを作ればいけると思います。 concat(CURRENT_DATE(),' ',concat_ws(':',hour(now()),'00','00')) ↑のような感じかな?(エラーになったらゴメンナサイ) 多分[yyyy-mm-dd hh:00:00]みたいになると思います。 先程のSQLのnow()と置き換えてみてください。 ※mySQLは使ったことないのでもっとスマートなやり方もあるかもしれません。

ao-man
質問者

お礼

やってみます。ありがとうございます。

回答No.6

条件が一致していれば持ってこれると思うのですがおかしいですねぇ。。。 認識が違うのかな? 例えば18:30に実行した場合、 17:30以降に登録されたものが取得される、であってますよね? もしかしてこの場合も17:00以降を取得とかだったりしますか?

ao-man
質問者

お礼

はい、17時以降のものが欲しいです;; でも、全部持ってこられなかった原因が分かりました。 fetchrow_array() で受け取っていたので1行分しか表示できなかったみたいですw whileで回して解消しました!すいませんでした~。 あとは、時間の問題だけです。よろしくおねがいしますっ!!

回答No.5

もしかして[LIMIT 1]をつけたままにしていませんでしょうか? 数字分だけ取得するという意味ですので つけなければ全件取得するはずです。

ao-man
質問者

お礼

いえ、最初にはずしました・・・ なぜでしょう凹

回答No.4

No2,3の回答左右間違えてました。。。(笑) お恥ずかしい。。。

ao-man
質問者

お礼

ダイジョウブです。こちらでも調べてみましたので。

回答No.3

違うところを参照しているとのことですが、 古いデータも取得してしまっているということでしょうか? そう思った根拠を示して頂けると回答しやすいです。 >あと、じゃあ(now(),'01:00:00')はどういう意味なんでしょう?? No2にもちょこっと書きましたが。。。 右の時間=now() 現在時刻 左の時間='01:00:00' 1時間 ですね。 現在時刻 - 1時間 ということで 1時間前の時刻が返ってきます。

ao-man
質問者

お礼

やり直してみたらちゃんと一時間前のものを引っ張ってきてたみたいです。 でもそのうちの一件しか引っ張ってこれないのですが、そーいうものなのでしょうか? たとえば今17時ですが、16時じ実行したものは全部引っ張って来たいのです。 何度もすみません。宜しくお願いいたします。

回答No.2

No1で答えた者です。 timeが登録された時間という認識でよろしかったでしょうか? 間違えているようならそこを登録時間に直してください^^; now()で現在の時間を取得、 subtimeは関数で右の時間から左の時間を引いた時間を返します。

ao-man
質問者

お礼

timeが登録時間であってます。そうですか~。了解です。 あと、じゃあ(now(),'01:00:00')はどういう意味なんでしょう??

関連するQ&A

  • 特定の範囲のデータを削除するには

    現在MySQLについて色々試行錯誤して勉強しています。 タイトルに関して、例えばSELECT構文ならば SELECT * FROM `mytable` WHERE `hoge` = 1 ORDER BY `foo` DESC LIMIT 10 , 20 で、該当の10件目~30件目(20件分)の範囲を取得できますが、 DELETE構文だと、LIMIT に offset (LIMIT 10←これ , 20)の指定が出来ないようで、 自分で考えた方法だと、範囲の決め手となる最小値・最大値を出してから、 WHERE節でその範囲に当てはまるものを消す、 といった形で、MySQLに3回アクセスすることになってしまいます。 またこの方法だと、最小値又は最大値と同じ値があると、 それを消すことができません。 (きっちりやるには他のユニークキーを用意して使用するなど手間がかかりそうです) 例のSELECT構文のように簡略化できないでしょうか。 どうかよろしくお願いします。 ----------------- 環境  PHP 5.2.5  MySQL 5.1.22

    • ベストアンサー
    • MySQL
  • 24時間以内に更新されたデータを取得

    MySQL3で24時間に更新されたデータを取得したいのですが、いまいち方法が分かりません。 select * from test WHERE to_days(now()-60*60*24) > UpdataDate このような形では無理なようなのですが、いい方法はあるでしょうか? UpdataDateはdatetime型です。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • phpとmysqlでデータの一覧表示をしたいと思っています。

    phpとmysqlでデータの一覧表示をしたいと思っています。 ずらーっと並べるだけでなく、1ページに100件した場合には 10行毎に<hr>や<br>などのタグを挿入して間隔を空けたいのですが どのようにしたらいいのか悩んでいます。 現在は下記のようにLIMITで何度もqueryを発行しています。 できれば1回のqueryで処理したいのですが 他にどのような方法があるでしょうか。 $rs = mysql_query("select * from data order by id desc LIMIT 0,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } $rs = mysql_query("select * from data order by id desc LIMIT 10,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } $rs = mysql_query("select * from data order by id desc LIMIT 20,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • JpGraph 折れ線グラフ MySQL  PHP 

    こんにちは。いつも御世話になっております。 PHPでJpGraphを使用している者です。MySQLのデータベースを用いてJpGraphで雨量の折れ線グラフを出したいと思っています。 グラフは一応でたのですがグラフの左側に最新のデータがきてしまいます。どのようにしたら良いのでしょうか。 最新の50件を表示したいです。 $res = mysql_query("select * from tokyo order by hizuke desc,jikan desc,hizuke LIMIT 50"); プログラムのどこを載せたら良いのかわかりませんが、アドバイスよろしくお願いします。 本当に困っているのでどなたか教えてくださるととても助かります。

    • 締切済み
    • PHP
  • PHP+MYSQLで直近3件のデータ表示

    直近のデータを3件表示するのに $sql =" select * from テーブル order by フィールド(date型) desc limit 3" ; だとうまくいくのですが DATETIME形に変えるとうまくいかないのは、何か変な事してますでしょうか? $sql =" select * from テーブル order by フィールド(datetime型) desc limit 3" ; 他の箇所は両方とも全く一緒です。 データは入れてあります。 宜しくお願いいたします。 全文は書けなかったので <?php require_once("dbini.php"); $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); $selectdb = mysql_select_db($DBNAME, $con); $sql =" select * from mem order by rupdate desc limit 3" ; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "<B>$recmax 件のデータがみつかりました。</B>"; $body .= "<TABLE border='1' cellpadding='2' cellspacing='0'> <TR> <TH bgcolor='#00CCCC'>会員ID</TH> <TH bgcolor='#00CCCC'>会員名</TH> <TH bgcolor='#00CCCC'>性別</TH> <TH bgcolor='#00CCCC'>ジャンル</TH> <TR>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<TR>\n"; $body .= "<TD>" . $col["id"] . "</TD>\n"; $body .= "<TD>" . $col["name"] . "</TD>\n"; $body .= "<TD>" . $col"seibetu"] . "</TD>\n"; $body .= "<TD>" . $col["cate"] . "</TD>\n"; $body .= "</TR>\n"; } $body .= "</TABLE>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> 以下 <?= $body ?> を貼り付けています

    • ベストアンサー
    • PHP
  • 同じページで同じカラムを複数指定

    同じページに同じ複数カラム $query = "SELECT kg FROM daykg ORDER BY day desc LIMIT 1,1"; $result = mysql_query($query); while($row = mysql_fetch_array($result)){ $kg2 = $row['kg']; $kg3 ='$row['kg']'; これだと、当たり前ですが$kg2と$kg3に二行目のカラムの値が入ってしまいます。 $kg3にLIMIT 2.1の値を入れるにはどうしたら良いですか??

    • ベストアンサー
    • PHP
  • 最新のものからデータを10件づつ昇順で並べたい

    MySQLで、最新のものからデータを10件づつ昇順で並べたいと思っています。 最新のデータを1ページ10件ごとに収めていきたいので(最初のページを半端にしたくないので)、データを降順に取り出し、それぞれ取り出した10件ごとに昇順で並べ変えることが出来ないかと、いろいろ工夫をしましたが行き詰っています。PHPスクリプト(一部ですが)は次のように書いています。 $from = ($page-1)*10; $query = "SELECT * FROM table ORDER BY age DESC, sinchou DESC, taijyuu DESC LIMIT 10 OFFSET $from"; 1.降順で取り出したデータ10件を昇順に並べ替えるにはどのようにすれば良いでしょうか? 2.最新のものからデータを10件づつ昇順で並べるための良い方法が、上記の他にありますでしょうか? なにかご示唆を頂ければ有難いです。よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • sqglについて

    sqlのlimitとdescは一緒に使えますか? 例 select * from hp order by limit id 0,20 order by id desc; idを小さい順に1~20個表示したいです。

    • ベストアンサー
    • MySQL
  • MySQLで最小値

    次の様な連番が入ったseqというフィールドがあります。 => select seq from hoge order by seq desc; seq ----- 427 426 425 424 423 422 421 420 419 418 (10 rows) これにlimit 5とすると次の様にな結果になります。 => select seq from hoge order by seq desc limit 5; seq ----- 427 426 425 424 423 (5 rows) このlimit 5で表示された結果の最小値(423)を取得したいのですが 上手くいきません。(わかりません) min(seq)を試してみたのですが418が返ってきてしまいます。 => select min(seq) from hoge order by seq desc limit 5; min ----- 418 (1 rows) limitで表示された結果の最小値(423)を とる事はできるのでしょうか? どうぞ宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • 特定のデータの前後を取得したい

    以下のようなテーブルがあり、 SELECT id , regist_date FROM table_name ORDER BY regist_date DESC; ↑このSQLで並べると↓以下になるとします。 id(int型)   regist_date(datetime型) 12      2017-03-30 08:05:03 95      2017-03-29 19:05:03 72      2017-03-28 12:05:03 15      2017-03-28 12:05:03 62      2017-03-27 15:05:03 94      2017-03-26 12:05:03 やりたい事はidが72というのが分かっており、 そのデータと前後のデータを取得したいです。 ※日付の部分が完全に重複するデータが存在する場合もあります。 ※idは重複しません。 ↓このデータがとりたいです。 95      2017-03-29 19:05:03 72      2017-03-28 12:05:03 15      2017-03-28 12:05:03 SELECT * FROM table_name WHERE id = 72 ORDER BY regist_date DESC; ここから先が分からなくなってしまいどなたかわかる方いらっしゃいますか?

    • ベストアンサー
    • MySQL

専門家に質問してみよう