MySQL 如何查询每一天的用户注册数量(近 7 日、15 日、30 日...)?

2019-04-25 15:43:18 +08:00
 NowTime

SegmentFault: https://segmentfault.com/q/1010000018986285

已经使用 Google 搜索过,没找到合适的答案(有些看不懂)

有以下表:

表字段: id 是用户唯一 id reg_time 是用户注册时间戳

mysql> SELECT id,reg_time FROM `apps_user` ;
+----+------------+
| id | reg_time   |
+----+------------+
|  1 | 1524322845 |
|  2 | 1524322945 |
|  3 | 1524323277 |
|  4 | 1524325325 |
|  5 | 1524325451 |
|  6 | 1524325517 |
|  7 | 1524340390 |
|  8 | 1524346779 |
|  9 | 1524346875 |
| 10 | 1524419896 |
| 11 | 1524456557 |
| 12 | 1524456564 |
| 13 | 1524456663 |
| 14 | 1524499581 |
| 15 | 1524504637 |
| 16 | 1524504718 |
| 17 | 1524523875 |
| 18 | 1524528715 |
| 19 | 1524542755 |
| 20 | 1524543480 |
+----+------------+
20 rows in set (0.00 sec)

我想要获取近 7 天、自定义时间范围内中的 每一天用户注册量

例如,我想要近 7 天中每一天的用户注册量,预想返回结果如下(这里的预想返回结果与开头表的数据无关联):

+-------------+-------+
|    date     | total |
+-------------+-------+
|  2019-04-19 |   3   |
|  2019-04-20 |   0   |
|  2019-04-21 |   0   |
|  2019-04-22 |   8   |
|  2019-04-23 |   0   |
|  2019-04-24 |   9   |
|  2019-04-25 |   2   |

请大神解答,先谢谢了!

9862 次点击
所在节点    MySQL
36 条回复
lihongjie0209
2019-04-25 15:45:53 +08:00
你应该不是开发吧
shuax
2019-04-25 15:46:07 +08:00
先搞个任务,把每一天的注册人数写一个表里面,然后 7 天什么的都是小意思。
glacer
2019-04-25 15:50:31 +08:00
时间戳转成 date,然后 group by
kisshere
2019-04-25 15:51:30 +08:00
保持队形,你应该不是开发吧
luozic
2019-04-25 15:53:03 +08:00
mysql 按时间段统计(年,季度,月,天,时)
按年汇总,统计:

select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by date_format(col, '%Y');

按月汇总,统计:

select sum(mymoney) as totalmoney, count(*) as sheets from mytable group by date_format(col, '%Y-%m');

按季度汇总,统计:

select sum(mymoney) as totalmoney,count(*) as sheets from mytable group by concat(date_format(col, '%Y'),FLOOR((date_format(col, '%m')+2)/3));

select sum(mymoney) as totalmoney,count(*) as sheets from mytable group by concat(date_format(col, '%Y'),FLOOR((date_format(col, '%m')+2)/3));

按小时:

select sum(mymoney) as totalmoney,count(*) as sheets from mytable group by date_format(col, '%Y-%m-%d %H ');

查询 本年度的数据:

SELECT * FROM mytable WHERE year(FROM_UNIXTIME(my_time)) = year(curdate())

查询数据附带季度数:

SELECT id, quarter(FROM_UNIXTIME(my_time)) FROM mytable;

查询 本季度的数据:

SELECT * FROM mytable WHERE quarter(FROM_UNIXTIME(my_time)) = quarter(curdate());

本月统计:

select * from mytable where month(my_time1) = month(curdate()) and year(my_time2) = year(curdate())

本周统计:

select * from mytable where month(my_time1) = month(curdate()) and week(my_time2) = week(curdate())

N 天内记录:

WHERE TO_DAYS(NOW())-TO_DAYS(时间字段)<=N

本篇文章来源于 Linux 公社网站(www.linuxidc.com) 原文链接: http://www.linuxidc.com/Linux/2012-11/74145.htm
dovme
2019-04-25 15:53:16 +08:00
用 date_format(date, format) 将注册时间转化为 2019-04-19 这样的格式,然后 groupby
CallMeReznov
2019-04-25 15:54:59 +08:00
想当年我运维入职,老板让我上线上 SQLSERVER 服务器查东西.手抖的一批...
不过还好我知道有个 count()
cjlmwcy
2019-04-25 15:56:06 +08:00
你应该不是开发吧
goodbye1014ac
2019-04-25 16:03:44 +08:00
你应该不是开发吧
misaka19000
2019-04-25 16:16:56 +08:00
在写数据的时候把 年、年-月、年-月-日 这种数据结构写到数据库中,之后可以直接使用 group 来进行搜索
kifile
2019-04-25 16:18:56 +08:00
你应该不是开发吧
cjlmwcy
2019-04-25 16:24:37 +08:00
SELECT
COUNT(u.id) AS total,
DATE_FORMAT(
FROM_UNIXTIME(u.reg_time),
'%Y-%m-%d'
) AS date
FROM
apps_user AS u
WHERE
FROM_UNIXTIME(u.reg_time) >= DATE_ADD(NOW(), INTERVAL - 7 DAY)
GROUP BY
date
richChou
2019-04-25 16:30:17 +08:00
甚至可能都不是资深产品经理
thisisgpy
2019-04-25 16:35:10 +08:00
你这问题吓得我一度怀疑自己到底会不会做开发
liuzhaowei55
2019-04-25 16:48:22 +08:00
楼上那些讽刺楼主的都是臭傻逼,有一个算一个。
二楼的做法是一个解决方案,主要问题就是如果某一天没有用户注册,直接用 SQL 是无法查询出来这天的统计数据的,所以需要结合逻辑解决问题,不能直接通过 SQL 获得最终结果。
junan0708
2019-04-25 16:56:04 +08:00
liuzhaowei55
2019-04-25 17:00:15 +08:00
@junan0708 首先表示感谢,其次就是希望下次不会遇到有人问统计半年内结果怎么办的问题了。
liprais
2019-04-25 17:04:45 +08:00
@liuzhaowei55 一个比较简单的做法是先做个日期表,然后用注册表左关联之后就可以补零了
另外讽刺楼主不对,张嘴就骂人也不对,与诸君共勉了
liuzhaowei55
2019-04-25 17:09:45 +08:00
@liprais 就是看不惯讽刺的这些人,自己没有真实的处理过这种问题,只看楼主描述不懂难点问题在哪里可以理解,你不要讲话就好了,自然会有明白的人出来解决问题比如二楼,现在我就想那个讽刺楼主的人,自己好好想想这个问题怎么解决吧,自己真实遇到这个问题了是不是能很好的解决。
Patrick95
2019-04-25 17:11:46 +08:00
还腆着脸嘲讽楼主,楼主起码有开源项目。
你们呢,就一张嘴吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/558628

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX