一般的な例(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_CONCATimplodeする仕事をします PHPで行ったでしょう; -
INTO句は、値がmy_variableという名前の変数内に保存されていることを確認します; -
PREPAREステートメントは文字列値(my_variableに保存したものなど)を取ります )そして値がSQLクエリであるかどうかをチェックします; -
EXECUTEステートメントは「プリペアドステートメント」を取り、それを実行します。
@my_variableは一時変数ですが、スカラー型(varchar、int、date、datetime、binary、float、doubleなど)のみにすることができます。ではありません 配列。
GROUP_CONCAT 関数は「集計関数」です。これは、集計値(配列と同様の概念-この場合はクエリの結果セット)を受け取り、単純な文字列の結果を出力することを意味します。