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_schema
databáze; CONCAT
funkce předponuje každému názvu tabulky znak'SELECT * FROM '
řetězec;GROUP_CONCAT
dělá práci, kteráimplode
by udělal v PHP;-
INTO
klauzule zajišťuje, že hodnoty jsou uloženy uvnitř proměnné s názvemmy_variable
; -
PREPARE
pří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
EXECUTE
pří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.