当前位置: 首页 > 知识库问答 >
问题:

MySQL查找上次付款是否过期

端木承业
2023-03-14

在我的表payments中,我处理用户已经进行的两次付款&;审判。试用设置为付费,但总额为零(0.00美元),如:

ID | Subscription | Plan | Total | Paid | Paid at | Expires at
1    1              1      0.00    1      null      2020-11-05

当试用版即将过期时,强制用户购买计划,将创建以下行:

ID | Subscription | Plan | Total | Paid | Paid at     | Expires at
1    1              1      0.00    1      null          2020-11-05
2    1              1      15.00   1      2020-11-06    2020-12-06

如您所见,total不再为零,变量paid_at也被填充。SQL代码应该读取行号2。

我现在需要的是核实上次付款是否过期。但在我们继续之前,请记住以下几点:用户可能选择购买一个计划,但不立即付款,这意味着第一笔付款必须是考虑的那一笔。示例:

ID | Subscription | Plan | Total | Paid | Paid at     | Expires at
1    1              1      0.00    1      null          2020-11-05
2    1              1      15.00   0      null          2020-12-06

在这种情况下,用户决定购买该计划,但尚未付款。SQL逻辑应该读取行号1的expires_at

当前我的SQL代码如下:

SELECT * 
FROM payments 
WHERE expires_at < '2020-11-06'
AND paid = true 
and subscription_id = 1
ORDER BY id DESC
LIMIT 1

我知道这永远不会起作用,因为它总是获取行号1,无论我是否有更多的行。我也知道,我可以选择最后一行支付,然后通过代码验证它是否已经过期,但我想通过SQL做这件事。

编辑1:SQL Fiddle帮助

我创建了三个表paymentspayments2payments3:

lt;1gt;付款->;一切正常!

2付款2->;一切正常!用户还没有付费,所以应该抓取第一行

3Payments3数据不正确。用户已经付款,因此SQL应该验证最后的expires_at

CREATE TABLE `payments` (
  `id` int(11) NOT NULL,
  `subscription_id` int(11) NOT NULL,
  `plan_id` int(11) NOT NULL,
  `total` double(10,2) NOT NULL,
  `expires_at` date NOT NULL,
  `paid` tinyint(1) NOT NULL,
  `paid_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `payments` ADD PRIMARY KEY (`id`);

INSERT INTO payments VALUES(1, 1, 1, 0, '2020-11-05', 1, null);

CREATE TABLE `payments_2` (
  `id` int(11) NOT NULL,
  `subscription_id` int(11) NOT NULL,
  `plan_id` int(11) NOT NULL,
  `total` double(10,2) NOT NULL,
  `expires_at` date NOT NULL,
  `paid` tinyint(1) NOT NULL,
  `paid_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `payments_2` ADD PRIMARY KEY (`id`);

INSERT INTO payments_2 VALUES(1, 1, 1, 0, '2020-11-05', 1, null);
INSERT INTO payments_2 VALUES(2, 1, 1, 15.00, '2020-12-06', 1, null);

CREATE TABLE `payments_3` (
  `id` int(11) NOT NULL,
  `subscription_id` int(11) NOT NULL,
  `plan_id` int(11) NOT NULL,
  `total` double(10,2) NOT NULL,
  `expires_at` date NOT NULL,
  `paid` tinyint(1) NOT NULL,
  `paid_at` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
ALTER TABLE `payments_3` ADD PRIMARY KEY (`id`);

INSERT INTO payments_3 VALUES(1, 1, 1, 0, '2020-11-05', 1, null);
INSERT INTO payments_3 VALUES(2, 1, 1, 15.00, '2020-12-06', 1, '2020-11-06 15:00:00');

共有1个答案

逄嘉熙
2023-03-14

用@NBK的提示解决。在MySQL中,我们不能在where中使用MAX,因此:

SELECT *
FROM `payments`
where subscription_id = 1 
  and (SELECT MAX(expires_at) 
         FROM payments 
        WHERE subscription_id = 1 AND paid = true) < CURDATE()
 类似资料:
  • 我使用的是windows应用商店,我使用的是PayPal Windows8 checkout SDK,正常付款可以,但我需要定期付款。让我知道PayPal Windows8 checkout SDK支持定期付款?。 https://github.com/paypal/Windows8SDK

  • 说明 微信支付-查询企业付款到零钱SDK。 官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3 类 请求参数类 请求参数 类名:\Yurun\PaySDK\Weixin\CompanyPay\Weixin\Query\Request 属性 名称 类型 说明 $_apiMethod string 接口名

  • 说明 微信支付-查询企业付款到银行卡SDK。 官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_3 类 请求参数类 请求参数 类名:\Yurun\PaySDK\Weixin\CompanyPay\Bank\Query\Request 属性 名称 类型 说明 $_apiMethod string 接口名称

  • 问题内容: 很久以前,我正在使用反射创建一个迷你ORM。 这完全有道理,我退出了我的小命令,并增强了CTRL + C,CTRL + V键(lib的目的是避免为我正在使用的Web应用程序中的不同表重复重写相同的代码段) 几年后,由于某种原因,我现在不记得(也不想记住)我正在阅读(或试图…)Hibernate源代码,因为我想知道他们是否使用AOP即时生成代码并避免反射惩罚,但令我惊讶的是,我所看到的全

  • 我正在使用PayPal快速结帐,我需要做的是稍后单独授权和捕获付款,我目前的PayPal流程是, 1) 我使用以下代码创建付款: Paypal将订单信息和重定向返回给我,我将用户重定向到

  • EasyWeChat 4.0.7+ 该模块需要用到双向证书,请参考:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3 企业付款到用户零钱 $app->transfer->toBalance([ 'partner_trade_no' => '1233455', // 商户订单号,需保持唯一性(只能是字母或

  • 问题内容: 通过TCP流发送()/ write()消息时,如何确定这些字节是否已成功传递? 接收方通过tcp确认接收到字节,因此发送方tcp堆栈应该知道。 但是当我send()一些字节时,即使无法发送数据包,send()也会立即返回,我在netcat上使用strace在linux 2.6.30上进行了测试,在发送一些字节之前先拔出网络电缆。 我只是在开发一个应用程序,在该应用程序中了解消息是否已传

  • 在Java中,我如何判断 Stripe 中的卡是否是默认支付选项?例如: 或者,我可以查询默认付款来源吗? 我问这个问题的原因是因为我想向客户显示一张卡的最后4位数字,以向他们显示他们当前默认的支付选项。但如果有多张卡,我怎么知道?