- ベストアンサー
MySQLで最新のデータから一回ずつ順番に取り出す方法 PHP
idと、dataという2つのカラムで構成されたMySQLがあります。 そのidはプライマリキーに設定してあり、auto incrementとして、どんどん数値が増えていく設定です(phpMyAdminを使ってテーブルを作っています) そこで、そのid番号の現在の最新のものを php側から呼び出して取得し、 その次、しばらくすると、PHP側で再びその最新から2番目 (2番目に新しいデータ)を取得する命令を 投げたいと思っています。 そのあとは、同じように、3番目に新しいもの、 4番目、5番目と続けたいと思っています。 その際、毎回、php側で MySQLのデータの読み出し命令を送るわけですが、 その際、最新のもの、2番目に最新のものを 時間差でSELECTしていくには、 どのようにすればいいでしょうか。 PHP側で「いま3番目に新しいものを読んだので次は4番目に新しいもの」というように前回の状態を保持しておくことってできるのでしょうか。 また、このidというのは、途中で消したりしているidもあったりするので、1番から始まっていたとしても、途中の30番とかが抜けていたりして、歯抜け状態ですので、id番号でセレクトするとエラーになる可能性が高いです。 なので、id番号ではなく、 テーブルの上の行から選んでいくという方法が ベストだと思っています。 そのような指定をMySQLの構文で指定することって可能なのでしょうか? ちなみに、一応、何番のidを読むというのは理解しており、 以下のような感じのSELECT文をphpのqueryで使っていたりします。 table_aから、変数$indexNumの値のidを読むという処理を、 変数$queryに入れている文が以下になります。 $query = "SELECT arrayset FROM `table_a` WHERE id= '$indexNum'"; このあたりのノウハウをご存知の方、教えてくださいますと幸いです。 お願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
いまいち意図がわからないけど・・・ SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1 でよいのでは?
その他の回答 (2)
- chukenkenkou
- ベストアンサー率43% (833/1926)
何をやりたいのか、いまいち分かりませんが。。。 >table_a内の最大のidのある行の、arraysetに含まれる値を取り出したい この文言が適切なら、MySQL 4.1以降ならサブクエリが使えます。 例えば、こんな感じ。 select arrayset from table_a where id=(select max(id) from table_a)
お礼
すみません、 OFFSETというものを使うことで処理が可能になりました。 紛らわしい補足ですみませんでした。
補足
ありがとうございます。 サブクエリでうまくidで最大のものを取り出すことが出来ました。 常にサイトにアクセスするたびに、 ある命令があるたびに、一回目は、 idで最大のものを取り出し、 また同一の命令があった場合は、idで2番目に最大のものを取り出し、 その次の命令では、idで3番目に最大のものを取り出すという流れの処理です。 (ちょっとわかりにくい処理で本当にすみません。。。) この場合、MAX(id)により、一番大きいidは取得できたのですが、 2番目以降はどうすればいいでしょうか。 ORDER BY idとしておいて、 そしてその上から2番目、次は3番目みたいに読み込むレコードを降ろしていくだけなのですが。。 ここだけアドバイスお願いできますでしょうか。 ちなみに、最初に記述していますように、 idはいつも連番になっているわけではないので、降順にならべたものを 上から拾っていきたいというだけになります。
- chukenkenkou
- ベストアンサー率43% (833/1926)
何をやりたいのか、理解に苦しみます。 ある時点でn番目であっても、他ユーザなどから追加や削除があれば、何番目かは変動してしまいます。 その時点での列値の最大値、あるいは前回拾った値の次に大きい値は、例えば次のようなSQLで拾えます。 select max(id) from table_a や select 選択リスト from table_a where id>前回拾ったid値 order by id limit 1 ただ、これが希望するアドバイスなのかどうかは、現状の質問内容からは判断できません。
補足
ありがとうございます。 select max(id) from table_a だと、table_a内の中で最大のidを取得 ということになってしまうと思うのですが、 やりたい処理としては、 table_a内の最大のidのある行の、arraysetに含まれる値を取り出したいのです。 そこで、指定のidナンバーの行のarraysetの中に含まれる値を取り出すという意味で、 $query = "SELECT arrayset FROM `table_a` WHERE id= '$indexNum'"; としていました。
お礼
すみません、 OFFSETというものを使うことで処理が可能になりました。 紛らわしい補足ですみませんでした。
補足
再度ご回答ありがとうございます。 このSQL文で、無事、idの最大時の、 arraysetの値を取得することが出来ました! ・・・ですが、idが2番目に大きい、3番目に大きいものと、 例えば、10秒ごとにidの降順にarraysetの値を取得していくとなると、 どうすればいいでしょうか。 2番目以降のデータの取得の仕方がわからなくて悩んでいます。 この処理はウェブサイト上で行うものなのですが、 ある命令があるたびに、一回目は、 idで最大時のarraysetの値を取り出し、 また同一の命令があった場合は、idで2番目に大きいときのarraysetの値を取り出し、 その次に同じ命令があった場合は、 idで3番目に最大のものを取り出すという流れの処理です。 (ちょっとわかりにくい処理で本当にすみません。。。) サイトをリロード(更新)した場合は、再度idの最大値のときのarraysetを読み込んでいきます。