MYSQL - SELECT 来自动态 table 名称的数据
MYSQL - SELECT data from dynamic table names
假设我有几个动态 table 名称,例如:
select table_name
from INFORMATION_SCHEMA.TABLES
where table_name like 'ifhcraw%';
ifhcraw_2016_03_25_13
ifhcraw_2016_03_26_19
ifhcraw_2016_03_28_2
而且我没有发现任何关于名称的规则。要查找上次编辑的 table 我刚刚 select 最后修改 table 查询:
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 获取数据。
我曾尝试使用变量,但失败了。例如:
SET @query1 := '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%\') ';
SET @query2 := concat('select *
from ', @query1);
PREPARE stmt from @query2;
execute stmt;
请帮忙解决问题。
尝试:
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)
更新
注意当有两个或多个表符合条件时,会失败如下:
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
您应该按您认为适当的方式处理。
假设我有几个动态 table 名称,例如:
select table_name
from INFORMATION_SCHEMA.TABLES
where table_name like 'ifhcraw%';
ifhcraw_2016_03_25_13
ifhcraw_2016_03_26_19
ifhcraw_2016_03_28_2
而且我没有发现任何关于名称的规则。要查找上次编辑的 table 我刚刚 select 最后修改 table 查询:
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 获取数据。 我曾尝试使用变量,但失败了。例如:
SET @query1 := '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%\') ';
SET @query2 := concat('select *
from ', @query1);
PREPARE stmt from @query2;
execute stmt;
请帮忙解决问题。
尝试:
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)
更新
注意当有两个或多个表符合条件时,会失败如下:
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
您应该按您认为适当的方式处理。