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; などのコマンドが大変役立っています。

0 件のコメント:

コメントを投稿

Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換する

 Linuxコマンドライン上でSVGベクタ画像をJPG等へラスタライズ変換することができるが、上手く変換されない場合がある。   以前作った魔法陣イラスト素材をイラスト素材ストックサイトへ登録しようと思い立ち、改めて素材用にラスタライズ変換をかけようとした。   ラスタライズ変換...