MySQLで複数テーブルにまたがる結果の総数を制限する方法
UNION ALLとLIMITを組み合わせて結果の総数を制限する
複数のテーブルにまたがる検索結果の合計件数を制限したい場合は、UNION ALLとLIMITを組み合わせることで実現できます。この記事では、例として3つのテーブルを作成し、それぞれの結果を結合した上で全体の件数を制限する手順を具体的に解説します。
1つ目のテーブル(demo3)を作成する
まず、次のクエリで最初のテーブルを作成します。
mysql> create table demo3 -> ( -> value int -> ); Query OK, 0 rows affected (1.39 sec)
続いて、insertコマンドでレコードを挿入します。
mysql> insert into demo3 values(10); Query OK, 1 row affected (0.13 sec) mysql> insert into demo3 values(20); Query OK, 1 row affected (0.08 sec) mysql> insert into demo3 values(30); Query OK, 1 row affected (0.08 sec)
select文でテーブルの内容を確認しましょう。
mysql> select *from demo3;
実行結果は次の通りです。
+-------+ | value | +-------+ | 10 | | 20 | | 30 | +-------+ 3 rows in set (0.00 sec)
2つ目のテーブル(demo4)を作成する
同じ要領で、2つ目のテーブルを作成します。
mysql> create table demo4 -> ( -> value1 int -> ); Query OK, 0 rows affected (2.10 sec)
insertコマンドでレコードを挿入します。
mysql> insert into demo4 values(40); Query OK, 1 row affected (0.10 sec) mysql> insert into demo4 values(10); Query OK, 1 row affected (0.09 sec) mysql> insert into demo4 values(60); Query OK, 1 row affected (0.17 sec)
select文でレコードを表示して確認します。
mysql> select *from demo4;
実行結果は次の通りです。
+--------+ | value1 | +--------+ | 40 | | 10 | | 60 | +--------+ 3 rows in set (0.00 sec)
3つ目のテーブル(demo5)を作成する
さらに、3つ目のテーブルも作成しておきましょう。
mysql> create table demo5 -> ( -> value2 int -> ); Query OK, 0 rows affected (2.13 sec)
こちらにもinsertコマンドでレコードを挿入します。
mysql> insert into demo5 values(100); Query OK, 1 row affected (0.09 sec) mysql> insert into demo5 values(60); Query OK, 1 row affected (0.14 sec) mysql> insert into demo5 values(50); Query OK, 1 row affected (0.10 sec)
select文でレコードを確認します。
mysql> select *from demo5;
実行結果は次の通りです。
+--------+ | value2 | +--------+ | 100 | | 60 | | 50 | +--------+ 3 rows in set (0.00 sec)
テーブル全体の結果総数を制限するクエリ
準備が整ったら、複数テーブルにまたがる結果の総数を制限するクエリを実行してみましょう。ポイントは、各サブクエリ内でORDER BY ~ DESCとLIMIT 2を指定して降順に2件ずつ取得し、それらをUNION ALLで縦に結合した上で、外側のLIMIT 2によって最終的な表示件数を制限している点です。
mysql> select tbl.* -> from ((select * from demo3 ORDER BY value DESC LIMIT 2 -> ) UNION ALL -> (select * from demo4 ORDER BY value1 DESC LIMIT 2 -> ) UNION ALL -> (select * from demo5 ORDER BY value2 DESC LIMIT 2 -> ) -> ) tbl -> -> LIMIT 2;
実行結果は次の通りです。
+-------+ | value | +-------+ | 30 | | 20 | +-------+ 2 rows in set (0.00 sec)
このように、UNION ALLで結合した後の結果セット全体に対してLIMIT句が適用されるため、3つのテーブルのデータをまとめて扱っていても、最終的には指定した件数(この例では2件)だけが返されます。各テーブルの上位N件を取得しつつ、全体の合計件数も絞り込みたい場合に非常に便利なテクニックなので、ぜひ活用してください。
-
MySQLでデータベース内のテーブル数を表示するクエリの書き方
INFORMATION_SCHEMA.TABLESを使ってテーブル数を取得するここでは例として、「WEB」というデータベースを使用しているものとします。このデータベース内に存在するテーブルの総数を調べたい場合、MySQLではINFORMATION_SCHEMA.TABLESを利用するのが便利です。INFORMATION_SCHEMAは、MySQLサーバーが管理しているメタデータ(データベース名、テーブル名、カラム情報など)を格納する仮想データベースであり、これを参照することでスキーマに関する情報をSQLで簡単に取得できます。テーブル数を表示するクエリ「WEB」データベース内のテーブル数を表示す
-
MySQLで複数テーブルの結果をマージする方法|JOINを使った結合手順を解説
MySQLで2つ以上のテーブルに分かれたデータを1つの結果としてまとめたい場合、JOIN(結合)を使うのが最もシンプルで効果的な方法です。この記事では、実際にテーブルを作成しながら、JOINによる結果のマージ手順をわかりやすく解説します。マージに使用するJOINの基本構文結果をマージするには、以下のような構文でシンプルなJOINを使用します。SELECT aliasName1.yourColumnName1, aliasName1.yourColumnName2, ... aliasName2.yourColumnName1 FROM yourTableName1 aliasN