Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL:Обобщете всички редове в таблицата в една заявка

Първият примерен код тук е съхранена процедура, която изпълнява целия процес в една стъпка, що се отнася до потребителя.

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

Бележки:

  • SELECT..INTO @sql създава необходимата заявка, а PREPARE... EXECUTE я изпълнява.

  • Задава променливата group_concat_max_len, за да позволи достатъчно дълъг низ резултат от GROUP_CONCAT.

Горната процедура е полезна за бърз преглед в среда на администратор като Navicat или в командния ред. Въпреки това, въпреки връщането на набор от резултати, доколкото ми е известно, той не може да бъде препратен в друг изглед или заявка, вероятно защото MySQL не е в състояние да определи, преди да го стартира, какви набори от резултати произвежда, да не говорим какви колони имат .

Така че все още е полезно да можете бързо да създадете, без ръчно редактиране, отделния оператор SELECT...UNION, който може да се използва като изглед. Това е полезно, ако искате да присъедините броя на редовете към друга информация за таблица от друга таблица. Ето още една съхранена процедура:

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

Бележки

  • Концепцията е много подобна на първата процедура. Добавих прекъсване на реда (CHAR(10)) към всяко дъщерно изявление „SELECT...UNION“ за удобство при прегледа или редактирането на изявлението.

  • Можете да създадете това като функция и да върнете SelectStatement, ако това е по-удобно за вашата среда.

Надявам се това да помогне.




  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:няма достъп до root акаунт

  2. Custom Query Pagination Cakephp

  3. Търсите наличност с MySQL (и PHP)?

  4. django.db.utils.OperationalError:(2026, „Грешка при SSL връзката:SSL_CTX_set_tmp_dh неуспешно“)

  5. Как да съхранявам ежедневни записи от mysql таблица в друга?