如何在MySQL数据库中按指定条件统计所有表的记录数?
统计数据库中所有表近30天的记录数
原来通过information_schema.tables获取的table_rows是MySQL维护的近似统计值,并非实时精确的行数,而且该视图无法关联表内的date_time字段做条件过滤,所以要统计符合date_time >= CURDATE() - INTERVAL 30 DAY的记录数,必须针对每个表执行带条件的COUNT()查询。
方法一:手动生成并执行联合查询
- 先查询
mydb库中包含date_time字段的所有表:
SELECT table_name FROM information_schema.columns WHERE table_schema = 'mydb' AND column_name = 'date_time';
- 对每个返回的表,拼接
COUNT()查询并通过UNION ALL合并结果:
SELECT 'table1' AS table_name, COUNT(*) AS recent_rows FROM mydb.table1 WHERE date_time >= CURDATE() - INTERVAL 30 DAY UNION ALL SELECT 'table2' AS table_name, COUNT(*) AS recent_rows FROM mydb.table2 WHERE date_time >= CURDATE() - INTERVAL 30 DAY UNION ALL -- 继续添加其他表的查询语句 ;
方法二:用存储过程自动遍历统计
如果表数量较多,写存储过程可以自动完成遍历和统计:
DELIMITER // CREATE PROCEDURE count_recent_rows() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE tbl_name VARCHAR(255); -- 定义游标,获取所有含date_time字段的表 DECLARE cur CURSOR FOR SELECT table_name FROM information_schema.columns WHERE table_schema = 'mydb' AND column_name = 'date_time'; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 创建临时表存储结果 DROP TABLE IF EXISTS temp_recent_counts; CREATE TEMPORARY TABLE temp_recent_counts (table_name VARCHAR(255), recent_rows INT); OPEN cur; read_loop: LOOP FETCH cur INTO tbl_name; IF done THEN LEAVE read_loop; END IF; -- 动态生成统计语句并执行 SET @sql = CONCAT('INSERT INTO temp_recent_counts SELECT ''', tbl_name, ''', COUNT(*) FROM mydb.', tbl_name, ' WHERE date_time >= CURDATE() - INTERVAL 30 DAY;'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END LOOP; CLOSE cur; -- 返回统计结果 SELECT * FROM temp_recent_counts; END // DELIMITER ;
调用存储过程即可获取结果:
CALL count_recent_rows();
注意事项
- 确保
mydb库中的目标表都存在date_time字段,否则需要调整游标中的过滤条件; - 如果
date_time是DATETIME类型,CURDATE() - INTERVAL 30 DAY会自动转换为YYYY-MM-DD 00:00:00,能准确筛选近30天(包含当天)的记录; - 临时表
temp_recent_counts会在会话结束后自动销毁,无需手动清理。
内容的提问来源于stack exchange,提问作者appu
相关产品推荐
相关产品推荐

