Mysql
 sql >> Database >  >> RDS >> Mysql

Interrogare un database con risultati da più tabelle?

Esempio generico (in PHP):

Costruire SQL dinamico o costruire le tue query SQL con l'aiuto di un linguaggio di programmazione sarebbe simile a questo (in PHP per es.):

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

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

Il fetchAll restituirà un array contenente i nomi di ogni tabella selezionata.

Il implode($glue, $array) La funzione prende un array e concatena ogni valore nell'array usando il $glue parametro - di solito prendi un array di valori e li implodi usando $glue = ',' per creare un elenco di valori separati da coma.

Nel nostro caso il implode ha una query parziale come $glue per creare un grande UNION JOIN interrogazione.

Dopo la $query finale è costruito dovrebbe assomigliare a:

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

Il risultato dovrebbe contenere tutto il DISTINCT righe da tutte le 4000 tabelle.

Esempio specifico (in 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 prima istruzione otterrà tutti i nomi delle tabelle dallo information_schema banca dati;
  • Il CONCAT La funzione antepone a ogni nome di tabella un 'SELECT * FROM ' stringa;
  • Il GROUP_CONCAT fa il lavoro che implode avrebbe fatto in PHP;
  • Il INTO La clausola assicura che i valori siano salvati all'interno di una variabile denominata my_variable;

  • Il PREPARE accetta un valore stringa (come quello che hai salvato in my_variable ) e controlla se il valore è una query SQL;

  • Il EXECUTE istruzione prende una "istruzione preparata" e beh... la esegue.

@my_variable è una variabile temporanea ma può essere solo di tipo scalare (varchar, int, date, datetime, binary, float, double ecc.) non una matrice.

Il GROUP_CONCAT function è una "funzione aggregata", il che significa che prende un valore aggregato (concetto simile a un array - nel nostro caso il set di risultati della nostra query) e restituisce un semplice risultato di stringa.