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

MySQL:Fassen Sie alle Tabellenzeilen in einer einzigen Abfrage zusammen

Der erste Beispielcode hier ist eine gespeicherte Prozedur, die den gesamten Prozess in einem Schritt ausführt, soweit es den Benutzer betrifft.

BEGIN

# zgwp_tables_rowcounts
# TableName RowCount
# Outputs a result set listing all tables and their row counts 
# for the current database

SET SESSION group_concat_max_len = 1000000;

SET @sql = NULL;
SET @dbname = DATABASE();

SELECT
  GROUP_CONCAT( 
    CONCAT (
      'SELECT ''',table_name,''' as TableName, COUNT(*) as RowCount FROM ', 
       table_name, ' '
    ) 
    SEPARATOR 'UNION '  
  ) AS Qry
FROM
  information_schema.`TABLES` AS t
WHERE
  t.TABLE_SCHEMA = @dbname AND
  t.TABLE_TYPE = "BASE TABLE"
ORDER BY
  t.TABLE_NAME ASC

INTO @sql
;

PREPARE stmt FROM @sql;

EXECUTE stmt;

END

Hinweise:

  • Das SELECT..INTO @sql erstellt die notwendige Abfrage und das PREPARE... EXECUTE führt sie aus.

  • Setzt die Variable group_concat_max_len, um eine ausreichend lange Ergebniszeichenfolge von GROUP_CONCAT zu ermöglichen.

Das obige Verfahren ist nützlich für einen schnellen Blick in eine Admin-Umgebung wie Navicat oder auf der Befehlszeile. Trotz der Rückgabe eines Resultsets kann es meines Wissens jedoch nicht in einer anderen Ansicht oder Abfrage referenziert werden, vermutlich weil MySQL vor der Ausführung nicht feststellen kann, welche Resultsets es erzeugt, geschweige denn welche Spalten sie haben .

Daher ist es immer noch nützlich, ohne manuelle Bearbeitung schnell die separate Anweisung SELECT...UNION zu erstellen, die als Ansicht verwendet werden kann. Das ist nützlich, wenn Sie die Zeilenanzahl mit anderen tabellenbezogenen Informationen aus einer anderen Tabelle verknüpfen möchten. Hiermit eine weitere Stored Procedure:

BEGIN

# zgwp_tables_rowcounts_view_statement
# Output: SelectStatement
# Outputs a single row and column, containing a (possibly lengthy)
# SELECT...UNION statement that, if used as a View, will output
# TableName RowCount for all tables in the current database.

SET SESSION group_concat_max_len = 1000000;
SET @dbname = DATABASE();

SELECT
  GROUP_CONCAT( 
    CONCAT (
      'SELECT ''',table_name,''' as TableName, COUNT(*) as RowCount FROM ', 
      table_name, ' ', CHAR(10)) 
    SEPARATOR 'UNION '  
  ) AS SelectStatement
FROM
  information_schema.`TABLES` AS t
WHERE
  t.TABLE_SCHEMA = @dbname AND
  t.TABLE_TYPE = "BASE TABLE"
ORDER BY
  t.TABLE_NAME ASC
;
END

Hinweise

  • Dem ersten Verfahren im Konzept sehr ähnlich. Ich habe jeder untergeordneten "SELECT...UNION"-Anweisung einen Zeilenumbruch (CHAR(10)) hinzugefügt, um das Anzeigen oder Bearbeiten der Anweisung zu erleichtern.

  • Sie könnten dies als Funktion erstellen und das SelectStatement zurückgeben, wenn dies für Ihre Umgebung bequemer ist.

Hoffe das hilft.