Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytać bazę danych z wynikami z wielu tabel?

Ogólny przykład (w PHP):

Konstruowanie dynamicznego SQL lub budowanie zapytań SQL za pomocą języka programowania wyglądałoby tak (np. w PHP):

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

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

fetchAll metoda zwróci tablicę zawierającą nazwy każdej wybranej tabeli.

implode($glue, $array) funkcja pobiera tablicę i łączy wszystkie wartości w tablicy za pomocą $glue parametr - zwykle bierzesz tablicę wartości i implodujesz je za pomocą $glue = ',' aby utworzyć listę wartości oddzielonych przecinkami.

W naszym przypadku implode ma częściowe zapytanie jako $glue w celu stworzenia jednego dużego UNION JOIN zapytanie.

Po ostatnim $query jest zbudowany, powinien wyglądać mniej więcej tak:

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

Wynik powinien zawierać wszystkie DISTINCT wiersze ze wszystkich 4000 tabel.

Konkretny przykład (tylko w formacie 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;
  • Pierwsza instrukcja pobierze wszystkie nazwy tabel z information_schema baza danych;
  • CONCAT funkcja poprzedza każdą nazwę tabeli przedrostkiem 'SELECT * FROM ' ciąg;
  • GROUP_CONCAT wykonuje zadanie, które implode zrobiłbym w PHP;
  • INTO klauzula zapewnia, że ​​wartości są zapisywane wewnątrz zmiennej o nazwie my_variable;

  • PREPARE instrukcja przyjmuje wartość ciągu (taką jak ta, którą zapisałeś w my_variable ) i sprawdza, czy wartość jest zapytaniem SQL;

  • EXECUTE instrukcja pobiera "przygotowaną instrukcję" i cóż... wykonuje ją.

@moja_zmienna jest zmienną tymczasową, ale może być tylko typu skalarnego (varchar, int, date, datetime, binarny, float, double itp.), nie tablica.

GROUP_CONCAT funkcja jest "funkcją agregującą", co oznacza, że ​​pobiera wartość zagregowaną (pojęcie podobne do tablicy - w naszym przypadku zestaw wyników naszego zapytania) i wyprowadza prosty wynik w postaci ciągu.



  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 WHERE IN Query - ORDER BY Match

  2. Jak wykonać JOIN z dwóch różnych kolumn do tej samej kolumny w osobnej tabeli?

  3. Sesja SQLAlchemy i relacja połączenia

  4. Jak dodać obrazek do bazy php mysql?

  5. MySQL:ALTER IGNORE TABLE ADD UNIQUE, co zostanie obcięte?