4

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

我试过了

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    
4

4 回答 4

5

尝试这样的事情:

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}'; 
于 2013-04-04T07:21:43.113 回答
3

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

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;

SQL Fiddle 示例

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

于 2013-04-04T07:24:06.667 回答
0

这是动态 SQL 的示例,如果要创建具有三列的表:
第一个是Table Name包含 main_table 的表名,第二个是在 main_tableColumn X的列中包含单引号 (') 字符User Name,第三个是Rows包含计数中每个表的行数Table Name

    SET @SQL = (选择 GROUP_CONCAT('SELECT''',
                                    `表名`,
                                    ''' AS `表名`,
                                    ', 引用(`用户名`), ',
                                    COUNT(*) AS Rows FROM `',
                                    `表名` SEPARATOR '` UNION ALL ')
                                    来自`.tables`
               );
    从@SQL 准备stmt;
    执行语句;
    DEALLOCATE PREPARE stmt;
于 2013-09-27T11:58:46.127 回答
-1

如果选择动态 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;
于 2013-09-25T08:45:13.350 回答