sql >> データベース >  >> RDS >> Mysql

複数のテーブルの結果を使用してデータベースにクエリを実行しますか?

    一般的な例(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 関数は「集計関数」です。これは、集計値(配列と同様の概念-この場合はクエリの結果セット)を受け取り、単純な文字列の結果を出力することを意味します。



    1. mysqlテーブルを下からスキャンする

    2. 配列値を整数に格納する

    3. 実際のエスケープ文字列とPDO

    4. INSERTを実行すると、十分な値を受け取れないのはなぜですか?