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

Spørg efter en database med resultater fra flere tabeller?

Generisk eksempel (i PHP):

At konstruere dynamisk SQL eller bygge dine SQL-forespørgsler ved hjælp af et programmeringssprog ville se sådan ud (f.eks. i PHP):

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

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

fetchAll metoden returnerer et array, der indeholder navnene på hver valgt tabel.

implode($glue, $array) funktion tager et array og sammenkæder hver værdi i arrayet ved hjælp af $glue parameter - normalt tager du en række værdier og imploderer dem ved hjælp af $glue =',' for at oprette en komasepareret liste over værdier.

I vores tilfælde implode har en delvis forespørgsel som $glue for at skabe én stor UNION JOIN forespørgsel.

Når den sidste $query er bygget, skal det ligne:

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

Resultatet skal indeholde alle DISTINCT rækker fra alle 4000 tabeller.

Specifikt eksempel (kun i SQL-format):

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;
  • Den første sætning får alle tabelnavnene fra informationsskemaet database;
  • CONCAT funktion præfikser hvert tabelnavn med et 'SELECT * FROM ' streng;
  • GROUP_CONCAT udfører det job, der imploderer ville have gjort i PHP;
  • INTO klausul sørger for, at værdierne er gemt i en variabel ved navn min_variabel;

  • PREPARE sætning tager en strengværdi (såsom den du gemte i min_variabel ) og kontrollerer, om værdien er en SQL-forespørgsel;

  • EXECUTE statement tager en "forberedt erklæring" og vel... udfører den.

@my_variable er en midlertidig variabel, men den kan kun være af en skalartype (varchar, int, dato, datetime, binær, float, double osv.) den er ikke et array.

GROUP_CONCAT funktion er en "aggregeret funktion", hvilket betyder, at den tager en aggregeret værdi (svarende koncept til en matrix - i vores tilfælde resultatsættet af vores forespørgsel) og udsender et simpelt strengresultat.



  1. Postgres replikation

  2. Brug af pdo i php med lagret procedure

  3. Forståelse af SQL Server Lockdown til Secure Database Environment

  4. Postgresql grupper efter for flere linjer