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

MYSQL-動的テーブル名からデータを選択します

    試してみてください:

    mysql> SELECT VERSION();
    +-----------+
    | VERSION() |
    +-----------+
    | 5.7.11    |
    +-----------+
    1 row in set (0.00 sec)
    
    mysql> DROP TABLE IF EXISTS `ifhcraw_2016_03_25_13`;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> DROP TABLE IF EXISTS `ifhcraw_2016_03_26_19`;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> DROP TABLE IF EXISTS `ifhcraw_2016_03_28_2`;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> CREATE TABLE `ifhcraw_2016_03_25_13` (
        ->   `id` INT
        -> );
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> CREATE TABLE `ifhcraw_2016_03_26_19` (
        ->   `id` INT
        -> );
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> CREATE TABLE `ifhcraw_2016_03_28_2` (
        ->   `id` INT
        -> );
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SET @`TABLE_NAME` := NULL;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT `TABLE_NAME` INTO @`TABLE_NAME`
        -> FROM `INFORMATION_SCHEMA`.`TABLES`
        -> WHERE `TABLE_NAME` LIKE 'ifhcraw%' AND
        ->       `UPDATE_TIME` = (SELECT MAX(`UPDATE_TIME`)
        ->                        FROM `INFORMATION_SCHEMA`.`TABLES`
        ->                        WHERE `TABLE_NAME` LIKE 'ifhcraw%'
        ->                       );
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    mysql> SELECT @`TABLE_NAME`;
    +---------------+
    | @`TABLE_NAME` |
    +---------------+
    | NULL          |
    +---------------+
    1 row in set (0.00 sec)
    
    mysql> SET @`qry` := IF(@`TABLE_NAME` IS NULL,
        ->                  'SELECT NULL',
        ->                  CONCAT('SELECT * FROM ', @`TABLE_NAME`));
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> PREPARE `stmt` FROM @`qry`;
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared
    
    mysql> EXECUTE `stmt`;
    +------+
    | NULL |
    +------+
    | NULL |
    +------+
    1 row in set (0.00 sec)
    
    mysql> DEALLOCATE PREPARE `stmt`;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> INSERT INTO `ifhcraw_2016_03_26_19`
        ->   (`id`)
        -> VALUES
        ->   (1);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT `TABLE_NAME` INTO @`TABLE_NAME`
        -> FROM `INFORMATION_SCHEMA`.`TABLES`
        -> WHERE `TABLE_NAME` LIKE 'ifhcraw%' AND
        ->       `UPDATE_TIME` = (SELECT MAX(`UPDATE_TIME`)
        ->                        FROM `INFORMATION_SCHEMA`.`TABLES`
        ->                        WHERE `TABLE_NAME` LIKE 'ifhcraw%'
        ->                       );
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT @`TABLE_NAME`;
    +-----------------------+
    | @`TABLE_NAME`         |
    +-----------------------+
    | ifhcraw_2016_03_26_19 |
    +-----------------------+
    1 row in set (0.00 sec)
    
    mysql> SET @`qry` := IF(@`TABLE_NAME` IS NULL,
        ->                  'SELECT NULL',
        ->                  CONCAT('SELECT * FROM ', @`TABLE_NAME`));
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> PREPARE `stmt` FROM @`qry`;
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared
    
    mysql> EXECUTE `stmt`;
    +------+
    | id   |
    +------+
    |    1 |
    +------+
    1 row in set (0.00 sec)
    
    mysql> DEALLOCATE PREPARE `stmt`;
    Query OK, 0 rows affected (0.00 sec)
    

    更新

    基準に一致するテーブルが2つ以上ある場合は、次のように失敗することに注意する必要があります。

    mysql> INSERT INTO `ifhcraw_2016_03_26_19`
        ->   (`id`)
        -> VALUES
        ->   (1);
    Query OK, 1 row affected (0,00 sec)
    
    mysql> INSERT INTO `ifhcraw_2016_03_28_2`
        ->   (`id`)
        -> VALUES
        ->   (1);
    Query OK, 1 row affected (0,00 sec)
    
    mysql> SELECT `TABLE_NAME`
        -> FROM `INFORMATION_SCHEMA`.`TABLES`
        -> WHERE `TABLE_NAME` LIKE 'ifhcraw%' AND
        ->       `UPDATE_TIME` = (SELECT MAX(`UPDATE_TIME`)
        ->                        FROM `INFORMATION_SCHEMA`.`TABLES`
        ->                        WHERE `TABLE_NAME` LIKE 'ifhcraw%'
        ->                       );
    +-----------------------+
    | TABLE_NAME            |
    +-----------------------+
    | ifhcraw_2016_03_26_19 |
    | ifhcraw_2016_03_28_2  |
    +-----------------------+
    2 rows in set (0,00 sec)
    
    mysql> SELECT `TABLE_NAME` INTO @`TABLE_NAME`
        -> FROM `INFORMATION_SCHEMA`.`TABLES`
        -> WHERE `TABLE_NAME` LIKE 'ifhcraw%' AND
        ->       `UPDATE_TIME` = (SELECT MAX(`UPDATE_TIME`)
        ->                        FROM `INFORMATION_SCHEMA`.`TABLES`
        ->                        WHERE `TABLE_NAME` LIKE 'ifhcraw%'
        ->                       );
    ERROR 1172 (42000): Result consisted of more than one row
    

    適切と思われる場合は、ケースを処理する必要があります。




    1. テーブルの主キーを見つけるためのSQLクエリ?

    2. エラー:ライブラリ「/opt/PostgreSQL/9.0/lib/postgresql/plperl.so」を読み込めませんでした:libperl.so:

    3. ストアドプロシージャで出力パラメータサイズを定義するにはどうすればよいですか?

    4. CMDを使用してMysqlにzipファイルをインポートする