【问题标题】:count the number of rows of each table (where table names are returned from subquery )计算每个表的行数(从子查询返回表名)
【发布时间】:2013-12-24 16:23:26
【问题描述】:

我正在从一个提供表列表的表中进行查询(根据不同的条件列表会有所不同)。
我想显示表名列表及其行数。我怎样才能做到这一点?

我试过了

select count(*) from (select tablename from main_table) as t;

但它只返回 main_table 中的条目数,而不是每个表中的条目数。
我可以使用系统表来获取行数,但我不想要所有表,只需要特定表,并且可能需要特定查询的行数。

算法是这样的

for tablenames in main_table where id>3:
    select count(*) from tablename where constraints    

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    试试这样的:

    SELECT table_name, table_type, SUM(TABLE_ROWS) 
    FROM information_schema.tables
    WHERE table_schema = 'db5' -- or your own schema
        AND  table_type ='BASE TABLE'
        AND table_name LIKE 'mytables%'
    GROUP BY table_name, table_type
    

    或者这个

    SELECT table_name, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_SCHEMA = '{your_db}'; 
    

    【讨论】:

      【解决方案2】:

      您可以简单地查询元数据:

      SELECT  Table_Name, table_rows
      FROM    INFORMATION_SCHEMA.TABLES
      WHERE   TABLE_TYPE = 'BASE TABLE'
      AND     TABLE_SCHEMA = 'YourDatabase';
      

      或者您需要使用UNION ALL

      SELECT  'T1' AS TableName, COUNT(*) AS Rows
      FROM    T1
      UNION ALL
      SELECT  'T2' AS TableName, COUNT(*) AS Rows
      FROM    T2
      UNION ALL
      SELECT  'T3' AS TableName, COUNT(*) AS Rows
      FROM    T3;
      

      如果这需要动态完成,那么您可以使用动态 SQL:

      SET @SQL = (SELECT GROUP_CONCAT('SELECT ''', 
                                      TableName, 
                                      ''' AS TableName, COUNT(*) AS Rows FROM ', 
                                      TableName SEPARATOR ' UNION ALL ')
                  FROM MainTable
                  --WHERE Some condition to limit tables
                  );
      
      PREPARE stmt FROM @SQL;
      EXECUTE stmt;
      

      Example on SQL Fiddle

      这本质上生成与UNION ALL 解决方案相同的 SQL,但会根据主表的内容创建 SQL。

      【讨论】:

      • 这是正确的答案,因为我不想访问信息架构。我试图在 monetdb 中执行此操作,但它不允许动态传递表名,因此我必须先发送到查询以检索表名,然后将它们联合所有查询
      【解决方案3】:

      这里是动态 SQL 的例子,如果你想创建三列的表:
      第一个是Table Name,包含main_table 的表名,第二个是Column X,在main_table 的User Name 列中包含单引号(')字符,第三个是Rows,其中包含每个表的行数Table Name:

      SET @SQL = (选择 GROUP_CONCAT('SELECT''', `表名`, ''' AS `表名`, ', 引用(`用户名`), ', COUNT(*) AS Rows FROM `', `表名` SEPARATOR '` UNION ALL ') 来自`.tables` ); 从@SQL 准备stmt; 执行语句; DEALLOCATE PREPARE stmt;

      【讨论】:

      • 你为什么写了两个答案??
      【解决方案4】:

      如果选择动态SQL,并且某些列名包含空格,则会发生错误。在这种情况下,只能通过 INFORMATION_SCHEMA.TABLES 处理元数据(如果您有权使用它),而不是动态 SQL 查询!
      假设您有表,并且该表的列名 Table Name 包含现有其他表的名称(带空格)。
      如果您想使用动态 SQL 并且有一些带有空格的列名,则正确的查询是:

      SET @SQL = (选择 GROUP_CONCAT('SELECT''', `表名`, ''' AS `表名`, COUNT(*) AS Rows FROM `', `表名` SEPARATOR '` UNION ALL ') 从主表 ); 从@SQL 准备stmt; 执行语句; DEALLOCATE PREPARE stmt;

      【讨论】:

      • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
      • 请不要添加“谢谢”作为答案。一旦你有足够的reputation,你就可以vote up questions and answers你觉得有帮助。
      • 如果您有新问题,请点击 按钮提出。如果有助于提供上下文,请包含指向此问题的链接。
      猜你喜欢
      • 2021-09-10
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2014-10-09
      相关资源
      最近更新 更多