MySQL:每天计算不同的行

Posted

技术标签:

【中文标题】MySQL:每天计算不同的行【英文标题】:MySQL: Count the distinct rows per day 【发布时间】:2012-12-20 21:23:35 【问题描述】:

我有一个有趣的问题需要做。我有一个表,其中包含一个包含 IP 地址号的INT 列(使用INET_ATON)和一个timestamp 列。我希望能够计算每天存在的唯一 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】:
SELECT  DATE(timestamp) Date, COUNT(DISTINCT ipNum) totalCOunt
FROM    tableName
GROUP   BY  DATE(timestamp)
SQLFiddle Demo

【讨论】:

这将每天生成多行。然后我可以以某种方式将 totalCount 列的所有行加在一起吗? 链接已失效 链接对我仍然有效,您只需在屏幕顶部选择正确的数据库类型并重建 投反对票,因为答案在另一个网站上,仅通过评论链接,这里没有评论如果该网站消失,答案可能是什么。【参考方案2】:

以下是过去 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;

【讨论】:

【参考方案3】:
$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 如果您测试您的查询,您将不会收到想要的结果。您正在请求timestamp 以及DATE() 此代码适用于每小时结果,也可计算 1 行中的(ips),这对我有用,与我阅读但没有工作的许多其他解决方案不同。如果您遇到错误(除非我不小心把“选择”不必要的命令),下面的作品完美 SELECT visitor_ip, COUNT (DISTINCT visitor_ip), DATE (date_added), date_added, ip_id FROM ".$ cam_ip_table."在哪里date_added>''。 $ 日志日期。 '' GROUP BY visitor_ip ORDER BY DATE (date_added) DESC 我很乐意告诉我你会在我的代码中更正什么以在未来改进。谢谢 请在 SQL Fiddle 上整理一些示例数据并证明它有效。

以上是关于MySQL:每天计算不同的行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中使用 ROW_NUMBER 来检查每位员工每天的行数?

每天一个linux命令grep

每天计算和汇总不同的值

在 MySQL 中计算每天的平均销售额

使用数据块计算过去 7 天每天的不同用户

使用 Django ORM 计算不同时区每天的事件类型