案例分析: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、 今天登录人数

select
  login_date,
  count( user_id)
from
  t_userlog
where
  date(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 

select
  a.user_id
from (
  select
      distinct(user_id)
  from
      t_userlog 
  where curdate()-date(login_date)=1
         ) as a
join (
   select distinct(user_id)
   from
      t_userlog 
   where date(login_date)=curdate()
       ) as b
on
   a.user_id=b.user_id;

结果输出

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

思路:

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

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

select
  user_id,
  recharge_amount 
from
  t_userlog 
where
  recharge_amount>500 
group by
  user_id;

结果输出

+---------+-----------------+
| user_id | recharge_amount |
+---------+-----------------+
|       1 |             600 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值