2016-08-29 9 views
0

Ich versuche, aus MySQL Tabellennamen auszuwählen, die von einer Abfrage zurückgegeben werden. Die Tabellennamen sind table_prefix_date (z. B. table_prefix_20160801).MySQL aus Tabellen auswählen, die von Abfrage zurückgegeben werden

Um alle Termine und entsprechenden Tabellennamen ich etwas wie folgt aus:

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; 

Alle Tische haben die gleichen Spalten und Indizes. Just do select * from (queryabove); schlägt fehl.

Kann mir bitte jemand ein Arbeitsbeispiel geben, wie ich Daten aus den Tabellen abrufen kann, die von der obigen Abfrage zurückgegeben wurden?

Antwort

3

Sie benötigen eine dynamische SQL-Anweisung auszuführen:

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 eine SQL Fiddle für die oben ist. Die Abfrage ist im Wesentlichen Ihre Abfrage mit der select und union all Logik.

Noch wichtiger ist jedoch, dass Sie keine Tabellen mit den gleichen Informationen entwerfen sollten. Stattdessen sollten Sie eine Datumsspalte in einer großen Tabelle haben, in die Sie einfügen.

+0

Ich konnte das nicht mit den in diesem Beispiel verwendeten Anführungszeichen ausführen. Durch den Wechsel in doppelte Anführungszeichen um die gesamte Abfrage herum läuft sie, gibt aber nur "select * from tablenames" zurück. Siehe http://sqlfiddle.com/#!9/4523b4/5 –

+0

@AndyThompson. . . Ich weiß nicht, was ich dachte (obwohl ich Jetlag als Ursache behaupten kann). Das Set sollte eigentlich eine Unterabfrage und keine Zeichenfolge verwenden. –

+0

Ich bekomme nur Fehler und scheint ein Klammern fehlt und Ticks/Anführungszeichen Probleme? –

Verwandte Themen