結合データのソートと行数の制限
広告
UNIONを使ってデータを結合した結果に対し、ソートや行数の制限を行う方法を確認します。単に文の最後にORDER BY句やLIMIT句を付けると最後のSELECT文に対するものとなってしまいます。そこで次のように各SELECT文を括弧で囲んで下さい。
(SELECT col_name1, ... FROM tbl_name1) UNION (SELECT col_name2, ... FROM tbl_name2) UNION (SELECT col_name3, ... FROM tbl_name3) ORDER BY col_name [ASC | DESC], ... LIMIT [offset,] row_count;
このようにした場合、ORDER BY句やLIMIT句はUNIONを使って結合したデータに対して有効となります。
例えば次のように記述します。
(SELECT id, name FROM user) UNION (SELECT code, name FROM customer) ORDER BY id;
上記の場合、2つのSELECT文によって取得したデータを結合したものに対し、「id」カラムを使って昇順に並べ替えを行ってからデータを取得します。
サンプル
実際に試してみます。まず次のようなテーブルを作成します。
mysql> create table user (username varchar(10), address varchar(10));
mysql> create table request (name varchar(10), address varchar(10), d date);
テーブルには次のようなデータを追加してあります。
では3つのテーブルから名前と住所に関するカラムのデータをそれぞれ取得し、結合した上で取得します。今回は重複行も含めて取得しています。次のように入力します。
mysql> select username, address from user -> union all select name, address from request;
では結合したデータを「address」カラムを対象にソートしてから取得してみます。
mysql> (select username, address from user) -> union all (select name, address from request) order by address;
今度は「username」カラムを対象にソートしてから取得してみます。
mysql> (select username, address from user) -> union all (select name, address from request) order by username;
最後に「username」カラムを対象にソートしたものから最大3行分だけ取得してみます。
mysql> (select username, address from user) -> union all (select name, address from request) -> order by username limit 3;
( Written by Tatsuo Ikura )