Exemple générique (en PHP) :
Construire du SQL dynamique ou construire vos requêtes SQL à l'aide d'un langage de programmation ressemblerait à ceci (en PHP par exemple) :
$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();
$query = 'SELECT * FROM '.implode(' UNION SELECT * FROM ');
$pdo->query($query);
Le fetchAll
renverra un tableau contenant les noms de chaque table sélectionnée.
Le implode($glue, $array)
la fonction prend un tableau et concatène chaque valeur du tableau en utilisant le $glue
paramètre - généralement, vous prenez un tableau de valeurs et les implosez en utilisant $glue = ','
pour créer une liste de valeurs séparées par des virgules.
Dans notre cas, le implode
a une requête partielle comme $glue
afin de créer un grand UNION JOIN
requête.
Une fois la dernière $query
est construit, il devrait ressembler à :
SELECT * FROM table_1_name
UNION
SELECT * FROM table_2_name
UNION
SELECT * FROM table_3_name
....
....
UNION
SELECT * FROM table_4000_name
Le résultat doit contenir tous les DISTINCT
lignes des 4 000 tables.
Exemple spécifique (au format SQL uniquement) :
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;
- La première instruction obtiendra tous les noms de table du
information_schema
base de données ; - Le
CONCAT
la fonction préfixe chaque nom de table avec un a'SELECT * FROM '
chaîne ; - Le
GROUP_CONCAT
fait le travail quiimplode
aurait fait en PHP ; -
Le
INTO
La clause s'assure que les valeurs sont enregistrées dans une variable nomméemy_variable
; -
Le
PREPARE
prend une valeur de chaîne (telle que celle que vous avez enregistrée dansmy_variable
) et vérifie si la valeur est une requête SQL ; - Le
EXECUTE
prend une "instruction préparée" et bien... l'exécute.
@my_variable est une variable temporaire mais elle ne peut être que de type scalaire (varchar, int, date, datetime, binary, float, double etc.) elle n'est pas un tableau.
Le GROUP_CONCAT
La fonction est une "fonction d'agrégation", ce qui signifie qu'elle prend une valeur agrégée (concept similaire à un tableau - dans notre cas, le jeu de résultats de notre requête) et génère un résultat de chaîne simple.