sql >> Base de Datos >  >> RDS >> Mysql

¿Consultar una base de datos con resultados de varias tablas?

Ejemplo genérico (en PHP):

La construcción de SQL dinámico o la creación de sus consultas SQL con la ayuda de un lenguaje de programación se vería así (en PHP, por ejemplo):

$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();

$query = 'SELECT * FROM '.implode(' UNION SELECT * FROM ');
$pdo->query($query);

El fetchAll devolverá una matriz que contiene los nombres de cada tabla seleccionada.

El implode($glue, $array) La función toma una matriz y concatena cada valor en la matriz usando $glue parámetro:generalmente toma una matriz de valores y los implosiona usando $glue = ',' para crear una lista de valores separados por comas.

En nuestro caso, implode tiene una consulta parcial como $glue para crear un gran UNION JOIN consulta.

Una vez que el $query final es construir debería verse algo como:

SELECT * FROM table_1_name
    UNION
SELECT * FROM table_2_name
    UNION
SELECT * FROM table_3_name
    ....
    ....
    UNION
SELECT * FROM table_4000_name

El resultado debe contener todos los DISTINCT filas de las 4000 tablas.

Ejemplo específico (en formato solo 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;
  • La primera instrucción obtendrá todos los nombres de las tablas del information_schema base de datos;
  • El CONCAT la función antepone cada nombre de tabla con un 'SELECT * FROM ' cadena;
  • El GROUP_CONCAT hace el trabajo que implode hubiera hecho en PHP;
  • El INTO cláusula se asegura de que los valores se guarden dentro de una variable llamada my_variable;

  • El PREPARE declaración toma un valor de cadena (como el que guardó en my_variable ) y comprueba si el valor es una consulta SQL;

  • El EXECUTE La declaración toma una "declaración preparada" y bueno... la ejecuta.

@my_variable es una variable temporal pero solo puede ser de tipo escalar (varchar, int, date, datetime, binary, float, double, etc.) no una matriz.

El GROUP_CONCAT La función es una "función agregada", lo que significa que toma un valor agregado (concepto similar a una matriz; en nuestro caso, el conjunto de resultados de nuestra consulta) y genera un resultado de cadena simple.