sql >> Base de Datos >  >> RDS >> Mysql

MySQL:resuma todos los recuentos de filas de la tabla en una sola consulta

El primer código de ejemplo aquí es un procedimiento almacenado que realiza todo el proceso en un solo paso, en lo que respecta al usuario.

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

Notas:

  • SELECT..INTO @sql crea la consulta necesaria y PREPARE... EXECUTE la ejecuta.

  • Establece la variable group_concat_max_len para permitir una cadena de resultados lo suficientemente larga de GROUP_CONCAT.

El procedimiento anterior es útil para una mirada rápida en un entorno de administración como Navicat o en la línea de comandos. Sin embargo, a pesar de devolver un conjunto de resultados, que yo sepa, no se puede hacer referencia a él en otra Vista o Consulta, presumiblemente porque MySQL no puede determinar, antes de ejecutarlo, qué conjuntos de resultados produce, y mucho menos qué columnas tienen. .

Por lo tanto, todavía es útil poder producir rápidamente, sin edición manual, la instrucción SELECT...UNION separada que se puede usar como una Vista. Eso es útil si desea unir los recuentos de filas a alguna otra información por tabla de otra tabla. Adjunto otro procedimiento almacenado:

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

Notas

  • Muy similar al primer procedimiento en concepto. Agregué un salto de línea (CHAR(10)) a cada declaración subsidiaria "SELECT...UNION", para facilitar la visualización o edición de la declaración.

  • Puede crear esto como una función y devolver SelectStatement, si eso es más conveniente para su entorno.

Espero que ayude.