sql >> Databasteknik >  >> RDS >> Mysql

Fråga efter en databas med resultat från flera tabeller?

Allmänt exempel (i PHP):

Att konstruera dynamisk SQL eller bygga dina SQL-frågor med hjälp av ett programmeringsspråk skulle se ut så här (i PHP till exempel):

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

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

fetchAll metod returnerar en array som innehåller namnen på varje tabell som valts.

implode($glue, $array) funktionen tar en array och sammanfogar varje värde i arrayen med hjälp av $glue parameter - vanligtvis tar du en rad värden och imploderar dem med $glue = ',' för att skapa en komaseparerad lista med värden.

I vårt fall implode har en delfråga som $glue för att skapa en stor UNION JOIN fråga.

När den sista $query är byggd ska det se ut ungefär så här:

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

Resultatet bör innehålla alla DISTINCT rader från alla 4000 tabeller.

Särskilt exempel (endast 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örsta satsen får alla tabellnamn från information_schema databas;
  • CONCAT funktion prefix varje tabellnamn med a 'SELECT * FROM ' sträng;
  • GROUP_CONCAT gör jobbet som implode skulle ha gjort i PHP;
  • INTO satsen ser till att värdena sparas i en variabel som heter my_variable;

  • PREPARE -satsen tar ett strängvärde (som det du sparade i my_variable ) och kontrollerar om värdet är en SQL-fråga;

  • EXECUTE statement tar ett "prepared statement" och väl... exekverar det.

@my_variable är en temporär variabel men den kan bara vara av skalär typ (varchar, int, date, datetime, binary, float, double etc.) den är inte en array.

GROUP_CONCAT funktion är en "aggregerad funktion" vilket betyder att den tar ett aggregerat värde (liknande koncept som en array - i vårt fall resultatuppsättningen av vår fråga) och matar ut ett enkelt strängresultat.



  1. Hur får man medelbetyg per produkt med hjälp av en kodifierare?

  2. MySql-fel:Kan inte uppdatera tabellen i lagrad funktion/trigger

  3. Ansluter till MySQL från Android med JDBC

  4. Generera flera rader från en enda rad baserat på datum