2016-08-29 3 views
0

쿼리에서 반환 한 MySQL 테이블 이름 중에서 선택하려고합니다. 테이블 이름은 table_prefix_date (예 : table_prefix_20160801)입니다.쿼리에서 반환 한 테이블에서 MySQL을 선택하십시오.

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); 일을 실패합니다.

누군가 나에게 위의 쿼리에서 반환 된 테이블에서 데이터를 검색하는 방법에 대한 몇 가지 실제 예를 들려 줄 수 있습니까?

답변

3

당신은 동적 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 바이올린입니다.

쿼리는 본질적으로 selectunion all 로직을 사용하는 쿼리입니다.

더 중요한 것은 동일한 정보를 포함하는 테이블 세트를 설계하지 않아야한다는 것입니다. 대신 큰 테이블에 날짜 열을 삽입해야합니다.

+0

이 예제에서 사용 된 따옴표로 실행할 수 없습니다. 전체 쿼리 주위에 큰 따옴표로 변경하면 실행되지만 여전히 "select * from tablenames"를 반환합니다. http://sqlfiddle.com/#!9/4523b4/5 –

+0

@AndyThompson을 참조하십시오. . . 나는 내가 무엇을 생각하고 있었는지 모른다 (비록 시차로 인한 피로를 원인으로 주장 할 수있다). 'set'은 실제로 문자열이 아닌 서브 쿼리를 사용해야합니다. –

+0

나는 단지 오류가 발생하고 괄호가 누락되고 틱/따옴표 문제가있는 것처럼 보입니까? –

관련 문제