我有一张表每分钟收到数百个请求。我遇到的问题是我需要一种方法来只选择过去5分钟内插入的行。我正在尝试这个:
SELECT count(id) as count, field1, field2
FROM table
WHERE timestamp > DATE_SUB(NOW(), INTERVAL 5 MINUTE)
ORDER BY timestamp DESC
我的问题是它返回70k +结果并计数。我不确定我做错了什么,但我很想得到一些帮助。另外,如果有一种方法可以按分钟对它们进行分组,看起来像:
| count | field1 | field2 |
----------------------------
我很喜欢这方面的帮助和指示,所以请让我知道你的想法。
答案 0 :(得分:13)
你真的不需要DATE_ADD/DATE_SUB
,日期算术更简单:
SELECT COUNT(id), DATE_FORMAT(`timestamp`, '%Y-%m-%d %H:%i')
FROM `table`
WHERE `timestamp` >= CURRENT_TIMESTAMP - INTERVAL 5 MINUTE
GROUP BY 2
ORDER BY 2
答案 1 :(得分:2)
以下看起来似乎与您所拥有的相近:
SELECT
MINUTE(date_field) as `minute`,
count(id) as count
FROM table
WHERE date_field > date_sub(now(), interval 5 minute)
GROUP BY MINUTE(date_field)
ORDER BY MINUTE(date_field);
请注意添加的列以显示分钟,以及GROUP BY子句将结果收集到相应的分钟中。想象一下,你有5个小桶,标有最后5分钟。现在想象你把4分钟左右的每一行扔到它自己的水桶里。 count()将计算每个桶中找到的条目数。这是GROUP BY如何工作的快速可视化。如果您需要更多信息,http://www.tizag.com/mysqlTutorial/mysqlgroupby.php似乎是GROUP BY的一个不错的写作。
如果你运行它并且每分钟的条目数似乎太高,你会想要做一些故障排除。尝试用MAX(date_field)和MIN(date_field)替换COUNT(id),这样你就可以知道它捕获的日期类型。如果MIN()和MAX()在范围内,则可能会有更多数据写入数据库,而不是您意识到的。
您可能还会仔细检查您将来没有日期,因为它们都是>现在()。如果出现问题,上面提到的MIN()/ MAX()检查也应该识别出来。