SQLデータベース:ソートしてから特定順位のカラムを取り出す

なお実行環境はPDO(Ubuntu13.04のPHP)+SQLiteです。

仮定:
アップロードされた時間でソートされたn番目の行からファイルIDを取得したいとします。

アップロードされたファイルの情報を、データベースに格納しています。
ファイルごとに、一意なIDとしてid、アップロードされた時刻としてuptimeが記録されています。
テーブルはfilesTable、id,uptime列(それぞれidがinteger型、uptimeがtimestamp型)
テーブルにはその他にファイル名なども記録されていますが、今回は関係ありません。

アップロードされたファイルは、DB中ではIDで管理します。 ファイル名FromID ()IDFromアップロードの順番 ()などの関数がPHPソース内で散見されることになる予定です。



3行目のIDを取得するなら、こんな感じです。
SELECT id FROM (SELECT id, uptime FROM filesTable ORDER BY uptime) LIMIT 1 OFFSET 3;

 実際には、アップロードされた順に使う(表示するとか)と思うので、
SELECT id FROM (SELECT id, uptime FROM filesTable ORDER BY uptime DESC) LIMIT 1 OFFSET 3;
 として降順に並べ替える使い方になると思います。


このSQLクエリーができるまで

おまけです。

まずは、「テーブルからなんか取り出す」レベルの適当さで、最低限のクエリーを書きます。
SELECT * FROM filesTable;

上の例ではすべての列を取り出しますが、必要な情報はidとuptimeだけなので、そのようにします。
SELECT id,uptime FROM filesTable;

アップロード時間でソートする必要があるので、ソート関数を探してきて、くっつけます。
SELECT id,uptime FROM filesTable ORDER BY uptime;

ここから混迷した探索の時間。(主にネットからコピペしたSQLクエリーが動かない)
"OFFSET 1*2" などとするのですが、OFFSETは環境によって記法が違うとのこと。
PDO環境ではLIMITの後でないとOFFSETが使えないかのようです。

とにかく"LIMIT 1 OFFSET n"を指定すれば、n番以降の1つだけを取得することができます。

改めて完成版 :
 SELECT id FROM (SELECT id, uptime FROM filesTabel ORDER BY uptime DESC) LIMIT 1 OFFSET 3;

 要するに、「ソート済したテーブルの先頭から、3番目以降の行を最大1つ取り出す」という考え方です。


 実際には、まだSQLに慣れていないので、試行錯誤の過程でもっと寄り道をしています。テスト環境(SQLiteデータベースファイル)を作って、ターミナルでSQL文を打って結果を見ながら動作確認している感じです。
SQLiteをターミナルで操作する sqlite3 ./mytestdb.sqlite やテーブルの状況を見られる SELECT * FROM  filesTable; などのコマンドが大変役立っています。

このブログの人気の投稿

GIMP2.8でイラストにペン入れを行う

squid3プロキシサーバの設定(Ubuntu13.10)

ubuntu13.04で無線LANが繋がらない場合の対処