結合データのソートと行数の制限

広告

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);

テーブルには次のようなデータを追加してあります。

p19-1

p19-2

では3つのテーブルから名前と住所に関するカラムのデータをそれぞれ取得し、結合した上で取得します。今回は重複行も含めて取得しています。次のように入力します。

mysql> select username, address from user
    -> union all select name, address from request;

p19-3

では結合したデータを「address」カラムを対象にソートしてから取得してみます。

mysql> (select username, address from user)
    -> union all (select name, address from request) order by address;

p19-4

今度は「username」カラムを対象にソートしてから取得してみます。

mysql> (select username, address from user)
    -> union all (select name, address from request) order by username;

p19-5

最後に「username」カラムを対象にソートしたものから最大3行分だけ取得してみます。

mysql> (select username, address from user)
    -> union all (select name, address from request)
    -> order by username limit 3;

p19-6

( Written by Tatsuo Ikura )