一般的な例(PHPの場合):
プログラミング言語を使用して動的SQLを構築したり、SQLクエリを構築したりすると、次のようになります(たとえば、PHPの場合):
$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();
$query = 'SELECT * FROM '.implode(' UNION SELECT * FROM ');
$pdo->query($query);
fetchAll
メソッドは、選択された各テーブルの名前を含む配列を返します。
implode($glue, $array)
関数は配列を受け取り、$glue
を使用して配列内のすべての値を連結します パラメータ-通常、値の配列を取得し、$glue = ','
を使用してそれらを実装します コマで区切られた値のリストを作成します。
この場合、implode
$glue
として部分的なクエリがあります 1つの大きなUNION JOIN
を作成するために クエリ。
最後の$query
ビルドは次のようになります:
SELECT * FROM table_1_name
UNION
SELECT * FROM table_2_name
UNION
SELECT * FROM table_3_name
....
....
UNION
SELECT * FROM table_4000_name
結果には、すべてのDISTINCT
が含まれている必要があります 4000テーブルすべての行。
具体例(SQLのみの形式):
SELECT GROUP_CONCAT(
CONCAT('select * from ', table_name)
SEPARATOR ' union '
)
INTO @my_variable
FROM information_schema.tables
WHERE table_schema = 'dbname'
AND table_name LIKE '%_name';
PREPARE my_statement FROM @my_variable;
EXECUTE my_statement;
- 最初のステートメントは、
information_schema
からすべてのテーブル名を取得します データベース; -
CONCAT
関数は、すべてのテーブル名の前に'SELECT * FROM '
を付けます。 文字列; -
GROUP_CONCAT
implode
する仕事をします PHPで行ったでしょう; -
INTO
句は、値がmy_variable
という名前の変数内に保存されていることを確認します; -
PREPARE
ステートメントは文字列値(my_variable
に保存したものなど)を取ります )そして値がSQLクエリであるかどうかをチェックします; -
EXECUTE
ステートメントは「プリペアドステートメント」を取り、それを実行します。
@my_variableは一時変数ですが、スカラー型(varchar、int、date、datetime、binary、float、doubleなど)のみにすることができます。ではありません 配列。
GROUP_CONCAT
関数は「集計関数」です。これは、集計値(配列と同様の概念-この場合はクエリの結果セット)を受け取り、単純な文字列の結果を出力することを意味します。