MySQL从查询返回的表中选择

MySQL从查询返回的表中选择,mysql,select,dynamic-sql,Mysql,Select,Dynamic Sql,我试图从查询返回的MySQL表名中进行选择。表格名称为表格前缀日期,例如表格前缀20160801 要获取所有日期和相应的表名,我执行以下操作: select concat('db_name.table_prefix_',a.Date) from ( select date_format(curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY,'%Y%m%d') as Date from (select 0 as a

我试图从查询返回的MySQL表名中进行选择。表格名称为表格前缀日期,例如表格前缀20160801

要获取所有日期和相应的表名,我执行以下操作:

select concat('db_name.table_prefix_',a.Date)
from (
     select date_format(curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY,'%Y%m%d') as Date
     from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
     cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
     cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) a
where date_format(Date,'%Y-%m-%d') between '2016-08-01' and '2016-08-20'
order by 1 asc;
所有表都有相同的列和索引。只需从上面的查询中选择*;失败了


有人能给我一些工作示例,说明如何从上述查询返回的表中检索数据吗?

您需要执行动态SQL语句:

set @sql = (
  select group_concat(replace('select * from @table', '@table', 
                               concat('table_prefix_', date_format(a.Date, '%Y%m%d'))
                             ) separator ' union all ')
  from (select date_sub(curdate(), INTERVAL (a.a + (10 * b.a) + (100 * c.a)) day) as Date
        from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a cross join
             (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) b cross join
             (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) c
       ) a
  where Date between '2016-08-15' and '2016-08-18'
);

prepare stmt1 from @sql;
execute stmt1; 
是上述问题的一个SQL工具

查询本质上是使用select和union all逻辑的查询


但是,更重要的是,您不应该设计一组包含相同信息的表。相反,您应该在一个大表中插入一个日期列。

您需要执行一个动态SQL语句:

set @sql = (
  select group_concat(replace('select * from @table', '@table', 
                               concat('table_prefix_', date_format(a.Date, '%Y%m%d'))
                             ) separator ' union all ')
  from (select date_sub(curdate(), INTERVAL (a.a + (10 * b.a) + (100 * c.a)) day) as Date
        from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) a cross join
             (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) b cross join
             (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) c
       ) a
  where Date between '2016-08-15' and '2016-08-18'
);

prepare stmt1 from @sql;
execute stmt1; 
是上述问题的一个SQL工具

查询本质上是使用select和union all逻辑的查询


但是,更重要的是,您不应该设计一组包含相同信息的表。相反,您应该在一个大表中插入一个日期列。

我无法使用本例中使用的引号来运行它。通过将整个查询更改为双引号,它将运行,但仍然只返回select*FROMTABLENAMES。请参阅@andythonpson。我不知道我在想什么,虽然我可以说时差是原因。集合实际上应该使用子查询,而不是字符串。我只得到错误,似乎是缺少括号和勾号/引号问题?已更新FIDLE以运行,但失败子查询返回多个1行。。sqlfiddle.com/!9/4523b4/12FYI-如果日期条件超过N天,此查询将失败。其中,“2016-08-27”和“2016-08-31”之间的日期有效,但“2016-08-26”和“2016-08-31”之间的日期无效。我无法使用此示例中使用的报价运行此操作。通过将整个查询更改为双引号,它将运行,但仍然只返回select*FROMTABLENAMES。请参阅@andythonpson。我不知道我在想什么,虽然我可以说时差是原因。集合实际上应该使用子查询,而不是字符串。我只得到错误,似乎是缺少括号和勾号/引号问题?已更新FIDLE以运行,但失败子查询返回多个1行。。sqlfiddle.com/!9/4523b4/12FYI-如果日期条件超过N天,此查询将失败。其中,“2016-08-27”和“2016-08-31”之间的日期有效,但“2016-08-26”和“2016-08-31”之间的日期无效。