在MySQL中根据兑换值查找匹配的行

rsl1atfo  于 2023-02-03  发布在  Mysql
关注(0)|答案(1)|浏览(111)

我正在实现带有到期功能的返现功能。我正在尝试根据提前到期日期兑换部分金额。我已经用下面的mysql命令根据到期日期对行进行了排序。

SELECT * FROM `cashback` WHERE `user_id` = 1 and `used`= 'NO' AND IF(CONCAT(`point_expiry`) !='0000-00-00 00:00:00', `point_expiry` >= NOW(), NOW()) ORDER BY (case when CONCAT(`point_expiry`) = '0000-00-00 00:00:00' then 9999
    else 1
    end) ASC, `point_expiry` ASC

下面的输出为
| 身份证|数量|点_到期日|用过的|用户标识|
| - ------|- ------|- ------|- ------|- ------|
| 三个|三十|2023年2月24日00时00分|否|1个|
| 1个|二十个|2023年2月25日00时00分|否|1个|
| 第二章|五十|00时00分00秒00时00分|否|1个|
现在我想根据上面的查询结果兑换价值
假设我想用35$兑换上述结果,预期结果为
| 身份证|数量|点_到期日|用过的|使用量|
| - ------|- ------|- ------|- ------|- ------|
| 三个|三十|2023年2月24日00时00分|否|三十|
| 1个|二十个|2023年2月25日00时00分|否|五个|
这里used_amount列表示基于amount列兑换的特定兑换值($35
非常感谢你的帮助!

pokxtpni

pokxtpni1#

这个函数使用SUM(amount) OVER(ORDER BY ...)来计算累计值,并将其与余额进行比较。

SELECT *
FROM (
    SELECT
        `id`,
        `amount`,
        `point_expiry`,
        `used`,
        `amount` - GREATEST(SUM(`amount`) OVER (ORDER BY IF(`point_expiry` = '0000-00-00 00:00:00', 1, 0) ASC, `point_expiry` ASC, id ASC) - /* Here is your amount --> */ 35, 0) AS `used_amount`
    FROM `cashback`
    WHERE (`point_expiry` >= NOW() OR `point_expiry` = '0000-00-00 00:00:00')
    AND `used` = 'NO'
    AND `user_id` = 1
) t
WHERE `used_amount` > 0;

相关问题