需求:客户充值积分,充值金额与积分并不按严格乘法对应,而是充值越多送的越多,比如充值 6 元得 600 积分,充值 10 元得 1200 积分,充值 20 元得 2500 积分这种。数据库里只存了用户激活后获得的积分,没有存实际金额。能否用一句 SQL 查询搜索出指定时间范围内所有用户总充值金额?
比如如下表
+----+-------+---------------------+
| id | value | update_time |
+----+-------+---------------------+
| 1 | 600 | 2022-02-08 15:16:05 |
| 2 | 1200 | 2022-02-07 03:58:01 |
| 3 | 600 | 2022-02-06 05:30:40 |
+----+-------+---------------------+
搜索 6-8 日内总计金额,希望得到的结果是 22 ,有什么写法不用经过业务在 sql 就能解决吗?
1
jptx 2022-02-13 00:54:06 +08:00 1
由于并不知道金额与积分的计算方式,所以目前的简单思路是假设用户只能选择几种充值金额,然后穷举对应关系写进 SQL 。
```sql select sum(case `value` when 600 then 6 when 1200 then 10 when 2500 then 20 剩下的自己补充...... else 自己补充异常情况 end ) from 这张表 where update_time > ? and update_time < ? and 其他条件 ``` |
2
ETiV 2022-02-13 01:01:24 +08:00
写法就是 LS+1 ,但我们不知道对于性能要求是啥样的,你最好自己有个判断
另外最好是再维护一张价格和积分的映射表,然后 join 是最方便的,不要把这种规则写在代码里 |
3
LeeReamond OP @ETiV 维护性的需求,不需要向用户展示,且充值档位有限,总体来说 1L 满足需求了,感谢
|
4
hay313955795 2022-02-13 08:48:03 +08:00
为啥不把金额也冗余到表里呢. 后面如果规则变了不是很麻烦?
|