案例分析:SQL基于MYSQL数据库的用户充值问题

一、建表

1、用户注册表:结构( 1 user id 2 注册日期时间 3 性别 )

create table t_usereg(user_id int primary key auto_increment,--用户id主键、自增registration_date datetime,--注册日期时间sex char(1)
);

2、登录表: 结构(1 user id 2 登录日期时间 3 充值金额 4 登出日期时间 )

用户可多次重复登录,所以主键设为联合主键较为合适。

create table t_userlog(user_id int ,login_date datetime,--登录日期时间recharge_amount int,--充值金额logout_date datetime,--登出日期时间primary key(user_id,login_date,recharge_amount,logout_date)
);

二、模拟数据用于自测

注册表

 登录表

三、问题概览

1 今天登录人数 
2 今天和昨天都登录的 id 
3 单笔充值金额大于 500 的 id 
4 累计充值金额大于 5000 的 id 
5 累计充值金额大于 5000 注册时间大于 1 年的 id 
6 男女充值金额差值 
7 总注册用户数量和总充值用户数量 
8 近期 30 天平均在线时长 2 小时的用户数量 
9 近期 30 天没登录用户数量 
10 连续两天充值大于 100 元的 id 

四、解决问题 
1、 今天登录人数

selectlogin_date,count( user_id)
fromt_userlog
wheredate(login_date)=curdate();

结果输出

+---------------------+-----------------+
| login_date          | count( user_id) |
+---------------------+-----------------+
| 2022-05-03 14:24:21 |               2 |
+---------------------+-----------------+
1 row in set (0.01 sec)

思路:

  • 登录日期=系统当前日期(注意建表时登录日期类型设置的是带时分秒的,这块得转换一下)
  • curdate()函数返回的是年月日,不带时分秒

2、 今天和昨天都登录的 id 

selecta.user_id
from (selectdistinct(user_id)fromt_userlog where curdate()-date(login_date)=1) as a
join (select distinct(user_id)fromt_userlog where date(login_date)=curdate()) as b
ona.user_id=b.user_id;

结果输出

+---------+
| user_id |
+---------+
|       2 |
|       4 |
+---------+
2 rows in set (0.01 sec)

思路:

  • 把昨天登录的用户id查出来,再把今天登录的用户查出来,然后做一个连接,此时会自动过滤掉只在其中一天登录的id。(注意id去重)
  • curdate()-date()得出来的是天数。

3 、单笔充值金额大于 500 的 id 

selectuser_id,recharge_amount 
fromt_userlog 
whererecharge_amount>500 
group byuser_id;

结果输出

+---------+-----------------+
| user_id | recharge_amount |
+---------+-----------------+
|       1 |             600 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部