运行mysql:5.7.44
我有一个表
wInvoices
,我需要根据另一个表wPayments
中最新匹配记录的值更新两列。 wPayments
表使用 wInvoices invID
作为绑定/匹配列,保存每张发票的所有 CC 交易(成功和拒绝)。每个invID
可以有多个wPayments
交易,但我只需要获取最新的一个;并使用该匹配中的值填充 wInvoices
列。
invID, paidDate, paidDate, (other columns) = wInvoices
===============================
1001
1002
1003
1004
pid, invID, mDate (other columns) = wPayments
===================================
2000 1001 2020-07-21 09:31:00 **
2001 1001 2020-07-20 08:20:20
2002 1001 2020-07-20 11:30:30
2003 1002 2020-07-20 09:09:00 **
2004 1003 2020-07-20 11:21:00
2005 1002 2020-07-19 13:30:00
2006 1003 2020-07-20 13:58:00 **
2007 1004 2020-07-20 09:45:00
2008 1004 2020-07-20 10:00:00 **
因此
wInvoices
的新值为:
invID, paidDate, paidID, (other columns)
===========================================================
1001 2020-07-21 09:31:00 2000
1002 2020-07-20 09:09:00 2003
1003 2020-07-20 13:58:00 2006
1004 2020-07-20 10:00:00 2008
我已经阅读了有关类似类型更新的多个线程,但无法找到任何符合我的确切要求的内容。挑战在于计算最新的 wPayments 记录。我能带的衣柜是这样的:
UPDATE wInvoices inv SET
inv.iPaidDate=pay.pDate
inv.iPaidReceipt=pay.pid
FROM (select pid,pDate from wPayments) pay
WHERE where inv.invID=pay.invID ;
...但这并不能说明大多数
recent
wPayments 记录,并且最终可能会使用旧记录中的数据填充 wInvoice 列。
IMO 最简单的方法是:
UPDATE wInvoices inv
INNER JOIN wPayments pay ON inv.invID=pay.invID
SET
inv.iPaidDate=pay.pDate
inv.iPaidReceipt=pay.pid
WHERE NOT EXISTS (
SELECT 1
FROM wPayments newer
WHERE newer.invID=pay.invID AND
(newer.mDate,newer.pid) > (pay.mDate,pay.pid)
)
但我质疑你的数据库模型;为什么不直接选择最新的付款信息以及发票而不是存储它?