MySQL:按天计算不同行数

31

我有一个有趣的查询需要执行。我有一个包含IP地址数字(使用INET_ATON)和时间戳列的表格,其中包含一个INT列。我想要能够统计每天唯一IP地址列的数量。也就是说,每天有多少个不同的IP行。例如,如果一个IP地址在同一天出现两次,则在最终计数中计为1,但如果相同的IP地址出现在另一天,它将被计算在那里,并进行第二次计数。

示例数据:

PK | FK  | ipNum      | timestamp
11 | 404 | 219395     | 2013-01-06 22:23:56
7  | 404 | 467719     | 2013-01-06 22:23:41
8  | 404 | 4718869    | 2013-01-06 22:23:42
10 | 404 | 16777224   | 2013-01-06 22:23:56
5  | 404 | 1292435475 | 2013-01-06 22:23:25
12 | 404 | 1526990605 | 2013-01-06 22:23:57
6  | 404 | 1594313225 | 2013-01-06 22:23:40
4  | 404 | 1610613001 | 2013-01-06 22:23:23
9  | 404 | 1628635192 | 2013-01-06 22:23:55
1  | 404 | 2130706433 | 2013-01-06 21:29:38
2  | 407 | 2130706433 | 2013-01-06 21:31:59
3  | 407 | 2130706433 | 2013-01-06 21:32:22

1
你能提供时间戳列的样本数据吗?(即使只有一个) - John Woo
3个回答

83
SELECT  DATE(timestamp) Date, COUNT(DISTINCT ipNum) totalCOunt
FROM    tableName
GROUP   BY  DATE(timestamp)

这将为每天生成多行。然后我能否将totalCount列的所有行相加? - Sam
1
链接现在已经失效。 - G_V
链接对我来说仍然有效,您只需要在屏幕顶部选择正确的数据库类型并重新构建即可。 - whisk
3
因为回答在另一个网站上,只有通过评论才能访问链接,如果该网站消失了,这里就没有解释这个答案可能是什么的评论,所以被踩。 - Dewi Morgan

8

以下是在过去7天内按天计算的数量统计方法:

select
    count(*) as count,
    date(timestamp) as date
from
    tablename
where
    timestamp >= date_sub(curdate(), interval 7 day)
group by 
    date;

+-------------+------------+
| count       | date       |
+-------------+------------+
| #forThatDay | 2020-02-21 |
| #forThatDay | 2020-02-22 |
| #forThatDay | 2020-02-22 |
| #forThatDay | 2020-02-23 |
| #forThatDay | 2020-02-24 |
| #forThatDay | 2020-02-25 |
| #forThatDay | 2020-02-26 |
+-------------+------------+
7 rows in set (0.03 sec)

首先按照 ipNum 列进行分组,以获取每天该列的唯一计数:

select
    count(*) as count,
    date(timestamp) as date
from
    tablename
where
    timestamp >= date_sub(curdate(), interval 7 day)
group by 
    ipNum, date;


-2
$log_date     = date('Y-m-d H:i:s');
$log_date     = date('Y-m-d H:i:s', strtotime($log_date.' -1 hour'));
SELECT ipNum, COUNT(ipNum), COUNT(DISTINCT ipNum), DATE(timestamp), timestamp FROM tableName  WHERE `timestamp` > '".$log_date."' GROUP BY ipNum ORDER BY DATE(timestamp) DESC  

这将会给你一个类似于的结果

 ip                  TIME               COUNTIPS
11.237.115.30     2018-01-27 19:13:51       1
21.744.133.52     2018-01-27 19:14:03       1
44.628.197.51     2018-01-27 19:48:12       14

我建议阅读有关MySQL如何处理GROUP BY的内容。 - Kermit
如果您测试查询,将无法获得所需的结果。您正在请求timestamp以及DATE() - Kermit
这段代码适用于小时结果,在1行中也计算了(ips),这对我很有效,与我阅读的许多其他解决方案不同,它们都无法正常工作。如果你遇到了错误(除非我意外地放置了“select”不必要的命令),以下代码可以完美运行:SELECT visitor_ip,COUNT(DISTINCT visitor_ip),DATE(date_added),date_added,ip_id FROM“.$cam_ip_table.”WHERE date_added>‘’。$Log_date.’’按visitor_ip进行分组,按DATE(date_added)倒序排列。如果您愿意,请告诉我您将在未来改进我的代码的哪些部分。谢谢 - Babis K.
请在 SQL Fiddle 上组合一些示例数据并展示其工作原理。 - Kermit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接