data-2010-10-10
data-2010-10-11
data-2010-10-12
data-2010-10-13
等等。所有表都具有相同的结构,我想要做的是一次从所有表中选择东西。因为我正在运行InnoDB,所以我无法使用MERGE表。无论如何,我使用以下语句从我的information_schema中选择表名:
select table_name from `information_schema`.`tables`
where `table_schema` = 'mydb2' and `table_name` like 'data-%'
返回我想要联合的所有表格。我也可以group_concat返回结果,以逗号作为分隔符列出。现在我陷入困境的是运行一个实际上从这些表中检索数据的select查询。
任何提示都表示赞赏。谢谢! ~K
答案 0 :(得分:3)
您必须使用动态SQL来构建查询(或查询)以从这些表中获取结果。也就是说,从info_schema查询中将表格作为字符串返回,然后将这些字符串插入到另一个查询中。
针对所有表格涉及UNION个别查询的内容:
SELECT ...
FROM (SELECT * FROM `data-2010-10-10`
UNION ALL SELECT * FROM `data-2010-10-11`
UNION ALL SELECT * FROM `data-2010-10-12`
UNION ALL SELECT * FROM `data-2010-10-13`) AS u
但我质疑你每天创建一个单独的表的设计。一开始做起来似乎很方便,但是表格传播失控,你最终难以进行普通的查询,比如你现在遇到的困难。这是antipattern我称之为元数据Tribbles 。
您的数据很可能存储在一个表中,并带有日期列,以便您区分不同日期的数据。您可能只需要创建索引来协助您针对总数据运行所需的查询。
重新评论:
您无法在SQL查询(包括视图定义)中使表名动态化。您可以将表名插入到字符串中,然后将该字符串准备为SQL查询。
您可以使用CONCAT()
函数构建字符串,然后使用PREPARE
and EXECUTE
将字符串作为查询运行。但是由于mysql客户端中没有循环结构,如果你不能用Python或PHP或某种类似的宿主语言编写脚本,你必须编写一个存储过程来执行此操作。