Algemeen voorbeeld (in PHP):
Het construeren van dynamische SQL of het bouwen van uw SQL-query's met behulp van een programmeertaal ziet er als volgt uit (in PHP bijvoorbeeld):
$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();
$query = 'SELECT * FROM '.implode(' UNION SELECT * FROM ');
$pdo->query($query);
De fetchAll
methode retourneert een array met de namen van elke geselecteerde tabel.
De implode($glue, $array)
functie neemt een array en voegt elke waarde in de array samen met behulp van de $glue
parameter - meestal neemt u een reeks waarden en implodeert u ze met $glue = ','
om een door coma gescheiden lijst met waarden te maken.
In ons geval de implode
heeft een gedeeltelijke zoekopdracht als $glue
om één grote UNION JOIN
te maken vraag.
Zodra de laatste $query
is gebouwd, zou het er ongeveer zo uit moeten zien:
SELECT * FROM table_1_name
UNION
SELECT * FROM table_2_name
UNION
SELECT * FROM table_3_name
....
....
UNION
SELECT * FROM table_4000_name
Het resultaat moet alle DISTINCT
. bevatten rijen van alle 4000 tabellen.
Specifiek voorbeeld (in SQL-only formaat):
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;
- De eerste instructie krijgt alle tabelnamen uit het
information_schema
databank; - De
CONCAT
functie laat elke tabelnaam voorafgaan met een a'SELECT * FROM '
tekenreeks; - De
GROUP_CONCAT
doet het werk datimplode
zou hebben gedaan in PHP; -
De
INTO
clausule zorgt ervoor dat de waarden worden opgeslagen in een variabele met de naammy_variable
; -
De
PREPARE
instructie heeft een tekenreekswaarde (zoals degene die u hebt opgeslagen inmy_variable
) en controleert of de waarde een SQL-query is; - De
EXECUTE
statement neemt een "voorbereide instructie" en goed... voert het uit.
@my_variable is een tijdelijke variabele, maar het kan alleen van een scalair type zijn (varchar, int, date, datetime, binary, float, double etc.) het is niet een array.
De GROUP_CONCAT
functie is een "aggregaatfunctie", wat betekent dat het een geaggregeerde waarde nodig heeft (vergelijkbaar met een array - in ons geval de resultatenset van onze query) en een eenvoudig tekenreeksresultaat oplevert.