1

似たような質問がいくつかありますが、それらは私が探しているものではないので、他の場所で答えられていると思われる場合はご容赦ください。

データを取得するためのテーブルが4000以上あるので、基本的に簡単な方法を探しています。この種は私の以前の投稿から続いています:mysqlはテーブル名のセグメントを検索します

一般的な状況では、データベースにテーブルがいっぱいあり、その約4分の1だけが必要で、約4000テーブルになります。以前の投稿のおかげで個々のテーブル名のリストがありますが、それらに付随するデータが必要です。個人の場合、SELECT table1。*、table2。*を実行できることを知っています。または同様の何かが、私は4000かそこらすべてを通過したくありません。それらはすべて同じもので終わります。たとえば、staff_name、manager_name、customer_nameなどです。

SHOW TABLES LIKE '%_name'

データベースに必要なテーブル名を確認します。誰かが動的mysqlの使用を提案しましたが、どこから始めればよいのかさえわかりません。助言がありますか?

4

2 に答える 2

1

SQLステートメントを生成することをお勧めします。

やってみてください:

select concat('select * from ', table_name) as query
from Information_Schema.tables
where table_schema = <dbname> and
      table_name like <whatever>

次に、クエリエディタウィンドウにコピーすることで、これを一連のクエリとして実行できます。

すべてを1つのクエリとして必要な場合は、次のようにします。

select concat('select * from ', table_name, ' union all ') as query
from Information_Schema.tables
where table_schema = <dbname> and
      table_name like <whatever>

そして、最後の「すべてのユニオン」を削除します。

これは、likeに一致するテーブル名を持っています。WHEREのtable_name部分を省略して、すべてのテーブルを取得します。または、()にtable_nameを使用して特定のテーブルを含めます。

于 2012-08-13T13:22:47.750 に答える
1

一般的な例(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 = ','して、コマで区切られた値のリストを作成します。

この場合、1つの大きなクエリを作成するためimplodeの部分的なクエリがあります。$glueUNION 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

結果には、DISTINCT4000個のテーブルすべてのすべての行が含まれている必要があります。

特定の例(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 '文字列を付けます。
  • PHPで実行されたであろうGROUP_CONCAT仕事をします。implode
  • この句は、値が;INTOという名前の変数内に保存されていることを確認します。my_variable

  • PREPAREステートメントは文字列値(に保存したものなど)を受け取り、そのmy_variable値がSQLクエリであるかどうかを確認します。

  • EXECUTEステートメントは「プリペアドステートメント」を取り、それを実行します。

@my_variableは一時変数ですが、スカラー型(varchar、int、date、datetime、binary、float、doubleなど)のみであり、配列ではありません。

このGROUP_CONCAT関数は「集計関数」です。つまり、集計値(配列と同様の概念-この場合はクエリの結果セット)を受け取り、単純な文字列の結果を出力します。

于 2012-08-13T13:22:25.023 に答える