sql >> Database >  >> RDS >> Mysql

Een database opvragen met resultaten uit meerdere tabellen?

Algemeen voorbeeld (in PHP):

Het construeren van dynamische SQL of het bouwen van uw SQL-query's met behulp van een programmeertaal ziet er als volgt uit (in PHP bijvoorbeeld):

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

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

De fetchAll methode retourneert een array met de namen van elke geselecteerde tabel.

De implode($glue, $array) functie neemt een array en voegt elke waarde in de array samen met behulp van de $glue parameter - meestal neemt u een reeks waarden en implodeert u ze met $glue = ',' om een ​​door coma gescheiden lijst met waarden te maken.

In ons geval de implode heeft een gedeeltelijke zoekopdracht als $glue om één grote UNION JOIN te maken vraag.

Zodra de laatste $query is gebouwd, zou het er ongeveer zo uit moeten zien:

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

Het resultaat moet alle DISTINCT . bevatten rijen van alle 4000 tabellen.

Specifiek voorbeeld (in SQL-only formaat):

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;
  • De eerste instructie krijgt alle tabelnamen uit het information_schema databank;
  • De CONCAT functie laat elke tabelnaam voorafgaan met een a 'SELECT * FROM ' tekenreeks;
  • De GROUP_CONCAT doet het werk dat implode zou hebben gedaan in PHP;
  • De INTO clausule zorgt ervoor dat de waarden worden opgeslagen in een variabele met de naam my_variable;

  • De PREPARE instructie heeft een tekenreekswaarde (zoals degene die u hebt opgeslagen in my_variable ) en controleert of de waarde een SQL-query is;

  • De EXECUTE statement neemt een "voorbereide instructie" en goed... voert het uit.

@my_variable is een tijdelijke variabele, maar het kan alleen van een scalair type zijn (varchar, int, date, datetime, binary, float, double etc.) het is niet een array.

De GROUP_CONCAT functie is een "aggregaatfunctie", wat betekent dat het een geaggregeerde waarde nodig heeft (vergelijkbaar met een array - in ons geval de resultatenset van onze query) en een eenvoudig tekenreeksresultaat oplevert.



  1. MySQL integer unsigned rekenkundige problemen?

  2. Records uit MySQL-database weergeven met JTable in Java

  3. Best practices voor MySQL-replicatie

  4. verbinding maken met de lokale MySQL-server via socket