SQLite3で登録されている合計金額が上位5位のユーザー名を調べたいとします。
使用するデータはパイソンでgimeiでSQLite3のRDB用のテストデータを用意してみるで作成したものを使います。
※ sample.sqlite3のパスが/path/to/dir/ledger.sqlite3で話を進めます。
# ledger.sqlite3があるディレクトリまで移動 $ cd /path/to/dir $ sqlite3 ledger.sqlite3
始めにledgerテーブルの方で、合計金額が上位5位のユーザー(出力はuser_id)まで絞ってみます。
sqlite> SELECT user_id FROM ledger GROUP BY user_id ORDER BY SUM(amount) DESC LIMIT 5; +---------+ | user_id | +---------+ | 94 | | 30 | | 98 | | 37 | | 44 | +---------+
GROUP BYでユーザーIDで纏めて、ORDER BY句でSUM(amount)の結果で並び替えをすると、合計が上位5位のユーザーまで絞り込むことができます。
この結果を手作業でusersテーブル用の構文を作っても良いですが、この構文自体をサブクエリという書き方でそのまま活用するという手もあります。
サブクエリの一般構文は下記の通りです。
SELECT カラム名 FROM テーブルA WHERE カラム名 演算子 (SELECT カラム名 FROM テーブルB WHERE 条件);
WHERE句内でカッコで囲った箇所で新たに構文を作って実行します。
この例を元に今回のSQLの文を書き換えますと、
sqlite> SELECT * FROM users WHERE id IN ( SELECT user_id FROM ledger GROUP BY user_id ORDER BY SUM(amount) DESC LIMIT 5 ); +----+------+ | id | name | +----+------+ | 30 | 依奈 | | 37 | 典男 | | 44 | 篤人 | | 94 | 羽琉 | | 98 | 妙奈 | +----+------+
になります。
この書き方はアプリケーション開発で良く使います。
SQLite Subquery: An Ultimate Guide for SQLite The Novices