使用多个表的结果查询数据库?

时间:2012-08-13 13:16:07

标签: mysql

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

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

一般情况是我有一个填充表格的数据库,我只想要大约四分之一到达4000个表格。由于我以前的帖子,我有一个单独的表名列表,但我想要与他们一起的数据。 我知道对于一个人我可以做SELECT table1。*,table2。*;或类似的东西,但我不想通过所有4000左右。 他们都以同样的方式结束,例如staff_name,manager_name,customer_name所以我可以使用

SHOW TABLES LIKE '%_name'

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

2 个答案:

答案 0 :(得分: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的部分查询为$glue,以便创建一个大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

结果应包含所有4000个表中的所有DISTINCT行。

具体示例(以纯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 :(得分: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>

删除最终的“联盟全部”。

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