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:每天计算不同的行的主要内容,如果未能解决你的问题,请参考以下文章