Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Eine Datenbank mit Ergebnissen aus mehreren Tabellen abfragen?

Generisches Beispiel (in PHP):

Das Erstellen von dynamischem SQL oder das Erstellen Ihrer SQL-Abfragen mit Hilfe einer Programmiersprache würde so aussehen (z. B. in PHP):

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

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

Der fetchAll -Methode gibt ein Array zurück, das die Namen jeder ausgewählten Tabelle enthält.

Der implode($glue, $array) Die Funktion nimmt ein Array und verkettet jeden Wert im Array mit $glue Parameter - normalerweise nehmen Sie ein Array von Werten und implodieren sie mit $glue = ',' um eine durch Komma getrennte Werteliste zu erstellen.

In unserem Fall der implode hat eine Teilabfrage als $glue um einen großen UNION JOIN zu erstellen Abfrage.

Einmal die letzte $query aufgebaut ist, sollte es in etwa so aussehen:

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

Das Ergebnis sollte den gesamten DISTINCT enthalten Zeilen aus allen 4000 Tabellen.

Spezifisches Beispiel (nur im 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;
  • Die erste Anweisung erhält alle Tabellennamen aus dem information_schema Datenbank;
  • Der CONCAT Funktion stellt jedem Tabellennamen ein 'SELECT * FROM ' voran Zeichenkette;
  • Der GROUP_CONCAT erledigt die Aufgabe, die implode in PHP getan hätte;
  • Der INTO -Klausel stellt sicher, dass die Werte in einer Variablen namens my_variable gespeichert werden;

  • Das PREPARE -Anweisung nimmt einen Zeichenfolgenwert (wie den, den Sie in my_variable gespeichert haben ) und prüft, ob der Wert eine SQL-Abfrage ist;

  • Das EXECUTE Statement nimmt ein "vorbereitetes Statement" und führt es aus.

@my_variable ist eine temporäre Variable, aber sie kann nur von einem skalaren Typ sein (varchar, int, date, datetime, binary, float, double etc.), sie ist nicht ein Array.

Der GROUP_CONCAT Die Funktion ist eine "Aggregatfunktion", was bedeutet, dass sie einen Aggregatwert nimmt (ähnliches Konzept wie ein Array - in unserem Fall die Ergebnismenge unserer Abfrage) und ein einfaches Zeichenfolgenergebnis ausgibt.