Mysql
 sql >> база данни >  >> RDS >> Mysql

Запитване до база данни с резултати от множество таблици?

Общ пример (в PHP):

Конструирането на динамичен SQL или изграждането на вашите SQL заявки с помощта на език за програмиране ще изглежда така (напр. в PHP):

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

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

fetchAll ще върне масив, съдържащ имената на всяка избрана таблица.

implode($glue, $array) функцията взема масив и свързва всяка стойност в масива с помощта на $glue параметър - обикновено вземате масив от стойности и ги имплодирате с помощта на $glue = ',' за създаване на списък със стойности, разделени със запетая.

В нашия случай implode има частична заявка като $glue за да създадете едно голямо UNION JOIN заявка.

След последната $query е компилирана, трябва да изглежда нещо като:

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

Резултатът трябва да съдържа всички DISTINCT редове от всичките 4000 таблици.

Конкретен пример (само във формат 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;
  • Първият израз ще получи всички имена на таблици от information_schema база данни;
  • CONCAT функция поставя пред всяко име на таблица 'SELECT * FROM ' низ;
  • GROUP_CONCAT върши работата, която implode би направил в PHP;
  • INTO клауза гарантира, че стойностите се записват в променлива с име my_variable;

  • PREPARE изразът приема стойност на низ (като тази, която сте записали в my_variable ) и проверява дали стойността е SQL заявка;

  • EXECUTE оператор приема "подготвен израз" и добре... го изпълнява.

@my_variable е временна променлива, но може да бъде само от скаларен тип (varchar, int, date, datetime, binary, float, double и т.н.) тя е не масив.

GROUP_CONCAT е „агрегирана функция“, което означава, че приема агрегирана стойност (подобна концепция на масив – в нашия случай наборът от резултати на нашата заявка) и извежда резултат от обикновен низ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Поръчайте заявка и покажете един произволен ред в горната част

  2. Напишете Pandas DataFrame в базата данни на MySQL

  3. как да извлечете множество резултати от съхранена процедура на mysql в laravel

  4. laravel eloquent връзка от конструктора на заявки

  5. Има ли начин да се направи SQL дъмп от Amazon Redshift