Obecný příklad (v PHP):
Konstrukce dynamického SQL nebo vytváření vašich SQL dotazů pomocí programovacího jazyka by vypadalo takto (např. v PHP):
$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();
$query = 'SELECT * FROM '.implode(' UNION SELECT * FROM ');
$pdo->query($query);
fetchAll metoda vrátí pole obsahující názvy každé vybrané tabulky.
implode($glue, $array) funkce vezme pole a zřetězí každou hodnotu v poli pomocí $glue parametr – obvykle vezmete pole hodnot a rozložíte je pomocí $glue = ',' k vytvoření seznamu hodnot oddělených čárkou.
V našem případě implode má částečný dotaz jako $glue za účelem vytvoření jednoho velkého UNION JOIN dotaz.
Po posledním $query sestavení by mělo vypadat nějak takto:
SELECT * FROM table_1_name
UNION
SELECT * FROM table_2_name
UNION
SELECT * FROM table_3_name
....
....
UNION
SELECT * FROM table_4000_name
Výsledek by měl obsahovat všechny DISTINCT řádků ze všech 4000 tabulek.
Konkrétní příklad (ve formátu pouze SQL):
SELECT GROUP_CONCAT(
CONCAT('select * from ', table_name)
SEPARATOR ' union '
)
INTO @my_variable
FROM information_schema.tables
WHERE table_schema = 'dbname'
AND table_name LIKE '%_name';
PREPARE my_statement FROM @my_variable;
EXECUTE my_statement;
- První příkaz získá všechny názvy tabulek z
information_schemadatabáze; CONCATfunkce předponuje každému názvu tabulky znak'SELECT * FROM 'řetězec;GROUP_CONCATdělá práci, kteráimplodeby udělal v PHP;-
INTOklauzule zajišťuje, že hodnoty jsou uloženy uvnitř proměnné s názvemmy_variable; -
PREPAREpříkaz přebírá hodnotu řetězce (jako je ta, kterou jste uložili domy_variable) a zkontroluje, zda je hodnota dotazem SQL; - Příkaz
EXECUTEpříkaz vezme "připravený příkaz" a dobře... jej provede.
@my_variable je dočasná proměnná, ale může být pouze skalárního typu (varchar, int, date, datetime, binary, float, double atd.), není pole.
GROUP_CONCAT funkce je "agregační funkce", což znamená, že přebírá agregovanou hodnotu (podobný koncept jako pole - v našem případě sada výsledků našeho dotazu) a výstupem je jednoduchý řetězec.