有一些类似的问题,但它们并不是我想要的,所以请原谅我,如果你认为这在其他地方得到了回答。
我基本上在寻找一种简单的方法,因为我有超过4000个表来获取数据。从我之前的帖子中可以看出这种情况:mysql search for segment of table name
一般情况是我有一个填充表格的数据库,我只想要大约四分之一到达4000个表格。由于我以前的帖子,我有一个单独的表名列表,但我想要与他们一起的数据。 我知道对于一个人我可以做SELECT table1。*,table2。*;或类似的东西,但我不想通过所有4000左右。 他们都以同样的方式结束,例如staff_name,manager_name,customer_name所以我可以使用
SHOW TABLES LIKE '%_name'
在数据库中查看我想要的表名。有人建议使用动态mysql,但我甚至不知道从哪里开始。有什么建议吗?
答案 0 :(得分:1)
构建动态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
行。
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包含特定表。