Mysql
 sql >> Base de données >  >> RDS >> Mysql

Interroger une base de données avec des résultats provenant de plusieurs tables ?

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 qui implode aurait fait en PHP ;
  • Le INTO La clause s'assure que les valeurs sont enregistrées dans une variable nommée my_variable;

  • Le PREPARE prend une valeur de chaîne (telle que celle que vous avez enregistrée dans my_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.