V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

SQL 语句求助,下述需求可否用一条语句优雅地实现?

  •  
  •   LeeReamond · 2022-02-13 00:25:36 +08:00 · 1027 次点击
    这是一个创建于 795 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求:客户充值积分,充值金额与积分并不按严格乘法对应,而是充值越多送的越多,比如充值 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 就能解决吗?

    4 条回复    2022-02-13 08:48:03 +08:00
    jptx
        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 其他条件
    ```
    ETiV
        2
    ETiV  
       2022-02-13 01:01:24 +08:00
    写法就是 LS+1 ,但我们不知道对于性能要求是啥样的,你最好自己有个判断

    另外最好是再维护一张价格和积分的映射表,然后 join 是最方便的,不要把这种规则写在代码里
    LeeReamond
        3
    LeeReamond  
    OP
       2022-02-13 01:11:48 +08:00
    @ETiV 维护性的需求,不需要向用户展示,且充值档位有限,总体来说 1L 满足需求了,感谢
    hay313955795
        4
    hay313955795  
       2022-02-13 08:48:03 +08:00
    为啥不把金额也冗余到表里呢. 后面如果规则变了不是很麻烦?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5610 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 06:34 · PVG 14:34 · LAX 23:34 · JFK 02:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.