MySQL - 计算名称特定表中超过 1 天的所有行

标签 mysql

这是我用来从表的名称中包含单词“设备”的表中获取所有行数的语句。

SELECT SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES 
  WHERE TABLE_NAME like '%devices%'

上面的效果非常好。但是,我只需要计算过去 24 小时内发生变化的行数。

这应该很容易做到,因为每个“%devices%”表都有一个名为 dateofinstall 的列,我在其中存储 unix 时间戳(纪元)。

所以我很自然地想使用以下语句:

SELECT SUM(TABLE_ROWS) FROM INFORMATION_SCHEMA.TABLES 
   WHERE TABLE_NAME like '%devices%' 
     and dateofinstall >= unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 1 DAY)

但这似乎不起作用!

还有其他方法可以获取名称特定表中超过 1 天的所有行的计数吗?

--

找到正确答案(感谢用户:Alma Do):

这会构建一个新查询,该查询在执行后会在 24 小时内返回计数。

SELECT 
  CONCAT('SELECT SUM(rowscount) FROM (', 
         GROUP_CONCAT(sqlcount SEPARATOR ' UNION ALL '), 
         ') as initunion') 
FROM 
  (SELECT 
    CONCAT('SELECT COUNT(1) AS rowscount FROM `',
    TABLE_SCHEMA,
    '`.`',
    TABLE_NAME,
    '` WHERE dateofinstall>= unix_timestamp(CURRENT_TIMESTAMP - INTERVAL 1 DAY)') as sqlcount 
   FROM 
     INFORMATION_SCHEMA.TABLES 
   WHERE 
     TABLE_NAME like '%devices%') as initcount;

最佳答案

你不能直接这样做。这是因为 - 即使 TABLE_ROWS 包含依赖于实际表数据的数据,它在任何情况下都不能与条件一起使用,并且 INFORMATION_SCHEMA 本身不包含任何表 数据,只有元数据

但是,有一种方法可以通过另一个 SQL 查询构建 SQL 查询来实现这一点。它将像:

SELECT 
  CONCAT('SELECT SUM(rowscount) FROM (', 
         GROUP_CONCAT(sqlcount SEPARATOR ' UNION ALL '), 
         ') as initunion') 
FROM 
  (SELECT 
    CONCAT('SELECT COUNT(1) AS rowscount FROM `',
    TABLE_SCHEMA,
    '`.`',
    TABLE_NAME,
    '` WHERE dateofinstall<NOW()-INTERVAL 24 HOUR') as sqlcount 
   FROM 
     INFORMATION_SCHEMA.TABLES 
   WHERE 
     TABLE_NAME like '%devices%') as initcount;

-生成的字符串将是有效的 SQL,您将能够通过 prepared statements 执行它.例如:

SET group_concat_max_len = 32000;
SET @sql = (SELECT 
  CONCAT('SELECT SUM(rowscount) FROM (', 
         GROUP_CONCAT(sqlcount SEPARATOR ' UNION ALL '), 
         ') as initunion') 
FROM 
  (SELECT 
    CONCAT('SELECT COUNT(1) AS rowscount FROM `',
    TABLE_SCHEMA,
    '`.`',
    TABLE_NAME,
    '` WHERE dateofinstall<NOW()-INTERVAL 24 HOUR') as sqlcount 
   FROM 
     INFORMATION_SCHEMA.TABLES 
   WHERE 
     TABLE_NAME like '%devices%') as initcount);
PREPARE stmt FROM @sql;
EXECUTE stmt;

-注意,GROUP_CONCAT()对返回字符串的长度有限制,因此您可能需要调整 group_concat_max_len为你的 session 。

此外,请注意,在通常情况下,通过另一个查询构建一个查询是一种架构味道(至少因为不可预测的 SQL 长度),但在您的情况下,这是可以接受的,因为您不会有太多表,显然。

关于MySQL - 计算名称特定表中超过 1 天的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20146479/

相关文章:

php - 比较 mysql 日期时间和 php YY

java - 将文本和图像添加到 ListView

php - 在 Yii 上出现 SQLSTATE[HY000] : General error: 2014 Cannot execute queries while other unbuffered queries are active 之类的错误

mysql - 如何正确查找重复项并将其删除

mysql - 选择列值较上一行发生变化的行、用户变量、innodb

mysql - SOLR-delta 导入不起作用,但完全导入工作正常

MySQL 5.7 Spring JPA 事务管理不起作用

java - Oracle 和 MySQL 中 PostgreSQL 的 XMIN

java - MySQL-Server/Apache Tomcat 和使用 Hibernate/JPA 的 Tapestry 项目的组合使用什么配置?

javascript - PHP时间戳转换