如何在MySQL中获取每n行?

时间:2009-02-02 10:49:45

标签: php mysql mysqli

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

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

如何返回MySQL中的每一行?我已阅读this博文,建议使用primaryKey%5 = 0,其中primaryKey为auto_increment但是

a)不使用索引 b)只返回可被5整除的primaryKey值,如果是删除,实际上可能不是每隔5行

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

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

2 个答案:

答案 0 :(得分: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的倍数的logentries,如果您在记录日志中有延迟,则可能会失败或类似的。

答案 1 :(得分:0)

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

SELECT Row, col_a 
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1 
WHERE Row%5 = 0;