1

周围有一些类似的问题,但它们并不是我想要的,所以如果你认为这在其他地方得到了回答,请原谅我。

我基本上是在寻找一种简单的方法来做事,因为我有超过 4000 个表可以从中获取数据。这种继承自我之前的帖子:mysql search for segment of table name

一般情况是我有一个充满表的数据库,我只想要大约四分之一的表,即大约 4000 个表。由于我以前的帖子,我有一个单独的表名列表,但我想要它们附带的数据。我知道对于个人我可以做 SELECT table1.*, table2.*; 或类似的东西,但我不想经历所有 4000 左右。它们都以相同的东西结尾,例如员工姓名、经理姓名、客户姓名,所以我可以使用

SHOW TABLES LIKE '%_name'

在数据库中查看我想要的表名。有人建议使用动态mysql,但我什至不知道从哪里开始。有什么建议么?

4

2 回答 2

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 = ','以创建一个逗号分隔的值列表。

在我们的例子中,为了创建一个大查询,它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

结果应包含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 '字符串;
  • 完成了在 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 回答
1

我建议生成 SQL 语句。

尝试做:

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

然后,您可以通过复制到查询编辑器窗口中将其作为一组查询运行。

如果您希望所有内容都作为一个查询,请执行以下操作:

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

并删除最后的“union all”。

这具有与like 匹配的表名。省略 WHERE 的 table_name 部分以获取所有表。或者,在 () 中使用 table_name 包含特定表。

于 2012-08-13T13:22:47.750 回答