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   |

请大神解答,先谢谢了!

9868 次点击
所在节点    MySQL
36 条回复
neoblackcap
2019-04-25 17:27:37 +08:00
用 SQL 实现不是不行,不过太复杂了,而且不好维护。像 12 楼的写法,过一个月之后再来看看没有注释的版本,大家觉得可以一眼就看出是怎么回事?
老实建汇总表,那么天天跑个定时任务脚本就可以了,简单易维护。
yjxjn
2019-04-25 17:29:12 +08:00
@lihongjie0209
@kisshere
@thisisgpy
@zhoujunjie221
@kifile
@goodbye1014ac
@cjlmwcy 都舔着脸嘲讽 LZ,键盘侠!
fangxing204
2019-04-25 17:40:34 +08:00
可以直接 group by 按范围的,https://stackoverflow.com/q/21421973/5615038
mamahaha
2019-04-25 18:18:15 +08:00
如果用 laravel,这个很方便,可以查询介于时间戳 xxxxxxxx 和 yyyyyyyyy 之间生成的用户
DB::table('users')->whereBetween('created_at',[ xxxxxxxxx,yyyyyyyyyy])->get();
victrec
2019-04-25 18:57:45 +08:00
最直接的时间戳转成时间再按情况取年月日进行 GROUP BY。不过具体到用,还得看数据多不多,多的话这么搞要炸,楼上说的对,写定时任务记下每天的数量,数据多了每小时统计一把。
Raymon111111
2019-04-25 19:04:01 +08:00
如果只需要数量的话就缓存是最简单的

每天一个 key, 注册一个 +1

然后要什么 7 天 30 天的数据就直接在缓存里找就行了

如果需要更快捷的就再每天 0 点的时候算一个统计的数量
funky
2019-04-25 19:06:03 +08:00
redis bitmap
lihongjie0209
2019-04-25 20:23:47 +08:00
@yjxjn 我就是说了一下 楼主应该不是开发 这就是嘲讽了?有多玻璃心啊

这种问题本来就是一个应用开发应该知道的:

1. 要么数据库查询的时候先转化成 date 类型, 再 groupBy, 数据量大的话可能会有性能问题
2. 要么数据库查询的时候直接用 时间戳 范围, 再在代码里面汇总。
3. 至于说定时任务和汇总表, 其实原理和上面的一样, 不过就是加了一个缓存而已。

这个问题的本质就是时间戳和日期的转化, 作为一个应用开发不知道时间戳?我怀疑楼主不是开发而可能是其他岗位临时使用数据库而已。

屁大点事,就 JJYY 的。
bwn123
2019-04-25 22:12:37 +08:00
不说动手能力,你应该连了解都没了解过开发流程吧
jessun1990
2019-04-26 09:31:28 +08:00
你应该是产品!
ccl945
2019-04-26 10:30:18 +08:00
别解释了,你就是一个前台客服!
jswh
2019-04-26 11:48:17 +08:00
让开发下载下来然后 excel 处理
jswh
2019-04-26 11:48:30 +08:00
@jswh 手动狗头
NowTime
2019-04-26 13:03:05 +08:00
@cjlmwcy 感谢
NowTime
2019-04-26 13:12:45 +08:00
@shuax
@liuzhaowei55
@neoblackcap
@Raymon111111
感谢各位建议,我算是业余的开发吧...我只是凭自己兴趣写的一个小小的项目,我以为能够直接使用 SQL 语句查询到每天的返回会结果,结果我还是太年轻,向各位大佬学习了!
GreatLiXin
2019-07-11 15:53:01 +08:00
@NowTime
我有一个比较省力的解法,今天我和你遇到了同样的问题
我们要统计每一天的 testCase Fail 的数量,同样,有时候会没有 Fail 的 case,这时候就会发现当天的日期直接在查询结果中消失。
在想了一下午后,我写出来了如下查询语句。很快捷也很简单。
```
SELECT
count(IF(status = false,true,null)) AS "Fail"
FROM function_test
GROUP BY date_time
```

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

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

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

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

© 2021 V2EX