sql >> Databáze >  >> RDS >> Mysql

Dotaz na databázi s výsledky z více tabulek?

Obecný příklad (v PHP):

Konstrukce dynamického SQL nebo vytváření vašich SQL dotazů pomocí programovacího jazyka by vypadalo takto (např. v PHP):

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

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

fetchAll metoda vrátí pole obsahující názvy každé vybrané tabulky.

implode($glue, $array) funkce vezme pole a zřetězí každou hodnotu v poli pomocí $glue parametr – obvykle vezmete pole hodnot a rozložíte je pomocí $glue = ',' k vytvoření seznamu hodnot oddělených čárkou.

V našem případě implode má částečný dotaz jako $glue za účelem vytvoření jednoho velkého UNION JOIN dotaz.

Po posledním $query sestavení by mělo vypadat nějak takto:

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

Výsledek by měl obsahovat všechny DISTINCT řádků ze všech 4000 tabulek.

Konkrétní příklad (ve formátu pouze 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;
  • První příkaz získá všechny názvy tabulek z information_schema databáze;
  • CONCAT funkce předponuje každému názvu tabulky znak 'SELECT * FROM ' řetězec;
  • GROUP_CONCAT dělá práci, která implode by udělal v PHP;
  • INTO klauzule zajišťuje, že hodnoty jsou uloženy uvnitř proměnné s názvem my_variable;

  • PREPARE příkaz přebírá hodnotu řetězce (jako je ta, kterou jste uložili do my_variable ) a zkontroluje, zda je hodnota dotazem SQL;

  • Příkaz EXECUTE příkaz vezme "připravený příkaz" a dobře... jej provede.

@my_variable je dočasná proměnná, ale může být pouze skalárního typu (varchar, int, date, datetime, binary, float, double atd.), není pole.

GROUP_CONCAT funkce je "agregační funkce", což znamená, že přebírá agregovanou hodnotu (podobný koncept jako pole - v našem případě sada výsledků našeho dotazu) a výstupem je jednoduchý řetězec.



  1. Německé přehlásky v MYSQL INSERT

  2. Nevloží hodnoty do databáze

  3. Chyby:Upozornění:Nedefinovaný index

  4. Sloupec funkce okna Postgres s kolejnicemi