9

我有一个表,其中包含每分钟记录的数据,所以我每分钟都有一行。在返回数据进行处理时,要求最后 6 小时的准确度,但在此之后,较低的准确度就足够了,例如每 5 分钟一次。

我可以将所有数据返回到一个数组中,然后删除除第 5 个元素之外的所有元素,但这需要 MySQL 返回所有数据,然后先读入数组 - 相当多的数据。

如何返回 MySQL 中的每 n 行?我已经阅读了这篇博客文章,其中建议使用 primaryKey % 5 = 0 其中 primaryKey 是 auto_increment 但这

a) 不使用索引 b) 将仅返回可被 5 整除的 primaryKey 值,并且在删除的情况下,实际上可能不是每 5 行

这可以仅在 SQL 查询中完成,还是需要使用游标逐行遍历结果集?

我在 PHP 中使用MySQLi连接到数据库。

4

2 回答 2

3

每 5 分钟的时间戳列表:

SELECT
  MIN(logtimestamp) AS first_of_five_minutes
FROM tLog
GROUP BY
  DATE(logtimestamp),
  HOUR(logtimestamp),
  MINUTE(logtimestamp) - (MINUTE(logtimestamp) % 5)

现在,您可以将其用作子选择,通过logtimestamps加入first_of_five_minutes. 当然,WHERE必须在内部和外部复制额外的 - 子句,以便获得“正确”的时间戳。

另外,请注意,这将返回每五分钟间隔内的第一个时间戳,而直接使用minutes%5 = 0仅返回日志条目的解决方案实际上是 :05 的倍数,如果您在记录日志或类似方面有延迟,则可能会失败。

于 2009-02-02T11:07:18.953 回答
0

完全未经测试,但这可能有效

SELECT Row, col_a 
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1 
WHERE Row%5 = 0; 
于 2009-02-02T10:57:16.040 回答