Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL:resumir todas as contagens de linhas da tabela em uma única consulta


O primeiro código de exemplo aqui é um procedimento armazenado que executa todo o processo em uma etapa, no que diz respeito ao usuário.
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:

  • O SELECT..INTO @sql cria a consulta necessária e o PREPARE... EXECUTE a executa.

  • Configura a variável group_concat_max_len para permitir uma string de resultado longa o suficiente de GROUP_CONCAT.

O procedimento acima é útil para uma rápida olhada em um ambiente de administração como o Navicat ou na linha de comando. No entanto, apesar de retornar um conjunto de resultados, até onde eu saiba, ele não pode ser referenciado em outra View ou Query, presumivelmente porque o MySQL não consegue determinar, antes de executá-lo, quais conjuntos de resultados ele produz, muito menos quais colunas eles têm .

Portanto, ainda é útil poder produzir rapidamente, sem edição manual, a instrução SELECT...UNION separada que pode ser usada como uma View. Isso é útil se você quiser unir as contagens de linhas a outras informações por tabela de outra tabela. Com este outro procedimento armazenado:
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

  • Muito semelhante ao primeiro procedimento em conceito. Eu adicionei uma quebra de linha (CHAR(10)) a cada instrução subsidiária "SELECT...UNION", para facilitar a visualização ou edição da instrução.

  • Você pode criar isso como uma função e retornar o SelectStatement, se for mais conveniente para o seu ambiente.

Espero que ajude.