这是我用来从表的名称中包含单词“设备”的表中获取所有行数的语句。
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/