【问题标题】:MySQL select from tables returned by queryMySQL 从查询返回的表中选择
【发布时间】:2017-01-05 12:15:22
【问题描述】:

我正在尝试从查询返回的 MySQL 表名中进行选择。表名是 table_prefix_date(例如 table_prefix_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;

所有表都有相同的列和索引。只是做select * from (queryabove); 失败。

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

【问题讨论】:

    标签: mysql select dynamic-sql


    【解决方案1】:

    需要执行动态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; 
    

    Here 是上面的 SQL Fiddle。

    查询本质上是您使用selectunion all 逻辑的查询。

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

    【讨论】:

    • 我无法使用本示例中使用的引号来运行它。通过将整个查询更改为双引号,它运行但仍然只返回“select * from tablenames”。见sqlfiddle.com/#!9/4523b4/5
    • @AndyThompson 。 . .我不知道我在想什么(尽管我可以声称时差是原因)。 set 应该真正使用子查询,而不是字符串。
    • 我只收到错误,似乎是缺少括号和刻度/引号问题?
    • 更新了 Fiddle 以运行但失败“子查询返回多个 1 行..”sqlfiddle.com/#!9/4523b4/12
    • 仅供参考 - 如果日期条件超过 N 天,则此查询失败。 “'2016-08-27' 和 '2016-08-31' 之间的日期”有效,但“'2016-08-26' 和 '2016-08-31' 之间的日期”无效。
    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多