Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Consultar um banco de dados com resultados de várias tabelas?

Exemplo genérico (em PHP):


Construir SQL dinâmico ou construir suas consultas SQL com a ajuda de uma linguagem de programação ficaria assim (em PHP por ex.):
$pdos = $pdo->query("SHOW TABLES LIKE '%_name'");
$tables = $pdos->fetchAll();

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

O fetchAll O método retornará um array contendo os nomes de cada tabela selecionada.

O implode($glue, $array) função pega um array e concatena todos os valores do array usando o $glue parâmetro - geralmente você pega um array de valores e os implode usando $glue = ',' para criar uma lista de valores separados por vírgulas.

No nosso caso, o implode tem uma consulta parcial como $glue para criar um grande UNION JOIN consulta.

Uma vez que a $query final é construir, deve ser 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

O resultado deve conter todos os DISTINCT linhas de todas as 4000 tabelas.

Exemplo específico (no formato somente 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;
  • A primeira instrução obterá todos os nomes das tabelas do information_schema banco de dados;
  • O CONCAT função prefixa cada nome de tabela com um 'SELECT * FROM ' cadeia;
  • O GROUP_CONCAT faz o trabalho que implode teria feito em PHP;

  • O INTO cláusula garante que os valores sejam salvos dentro de uma variável chamada my_variable;

  • O PREPARE A instrução recebe um valor de string (como o que você salvou em my_variable ) e verifica se o valor é uma consulta SQL;
  • O EXECUTE declaração pega uma "instrução preparada" e bem... a executa.

@my_variable é uma variável temporária, mas só pode ser do tipo escalar (varchar, int, date, datetime, binary, float, double etc.) não uma matriz.

O GROUP_CONCAT function é uma "função agregada", o que significa que ela recebe um valor agregado (conceito semelhante a uma matriz - no nosso caso, o conjunto de resultados de nossa consulta) e gera um resultado de string simples.