mysql 根据另一个表中的最新匹配更新多个列

问题描述 投票:0回答:1

运行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 列。

mysql sql-update
1个回答
0
投票

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)
)

但我质疑你的数据库模型;为什么不直接选择最新的付款信息以及发票而不是存储它?

© www.soinside.com 2019 - 2024. All rights reserved.