根据来自另一个表的最新日期更新2个表列

时间:2018-11-24 01:15:15

标签: mysql

我已经搜索了该站点并尝试了许多sql变体,但似乎无法获得正确的结果。

我有两个表,一个表名为“事件”,另一个表名为“杰出”。我在未完成的表“ Last_event”和“ Event_date”中添加了两列。每个表的唯一标识符是“ Account_number”。我正在尝试在“事件”表中查找“事件名称”字段包含“集合”的Account_number中的所有事件,然后找到最新的关联“ Created_date”。该日期将保存在“未完成”表的“ Event_date”字段中,而相关的“ Event_name”将保存在“ Last_event”字段中。

这是我所拥有的:

UPDATE outstanding as C 
inner join (SELECT l.Account_number, e.Created_date, e.Event_name 
            FROM outstanding l 
            INNER JOIN events e on(l.Account_number = e.Account_number) 
            WHERE Event_name LIKE 'Collections:%'
            ORDER BY `e`.`Created_date` desc) AS D on(C.Account_number = D.Account_number) 
set C.Event_date = D.`Created_date`, 
    C.Last_event = D.`Event_name`

这非常接近工作,但是,如果存在多个事件,则会按字母顺序保存第一个“ Event_name”。

如果需要更多信息,请告诉我。任何帮助将不胜感激。

以下是示例数据:

事件表:

enter image description here

杰出表:

enter image description here

预期结果:

enter image description here

这是表结构:

事件表: events table

杰出表: outstanding table

1 个答案:

答案 0 :(得分:1)

我认为您的INNER JOIN比您需要的还要复杂。您真正想要的是与名称中带有单词'Collections'的帐户中的事件相关的最新(最长)日期。请注意,由于您的日期不是MySQL格式,因此需要先进行转换,然后才能对其进行测试。您可以使用以下查询:

UPDATE outstanding as C 
inner join (SELECT Account_number, Created_date, Event_name 
            FROM events e
            WHERE Event_name LIKE '%Collections%' AND
               STR_TO_DATE(Created_date, '%m/%d/%y %H:%i') = (SELECT MAX(STR_TO_DATE(Created_date, '%m/%d/%y %H:%i')) 
                               FROM events e1
                               WHERE e1.Account_Number = e.Account_Number AND
                                     e1.Event_name LIKE '%Collections%')
            ) AS D on (C.Account_number = D.Account_number) 
set C.Event_date = D.Created_date, 
    C.Last_event = D.`Event_name`

UPDATE之后的表格内容(根据您的示例数据):

id  Account_number  Last_event                                  Event_date
19  8599            Collections: Sent to Outside Collections    2/16/18 0:00

Demo on dbfiddle

更新

基于提供的小提琴,表中的日期实际上是dd/mm/YYYY HH:mm格式,而不是问题中的示例数据所示的dd/mm/yy HH:mm格式。因此,对STR_TO_DATE的调用需要进行调整:

UPDATE outstanding as C 
inner join (SELECT Account_number, Created_date, Event_name 
            FROM events e
            WHERE Event_name LIKE '%Collections%' AND
               STR_TO_DATE(Created_date, '%m/%d/%Y %H:%i') = (SELECT MAX(STR_TO_DATE(Created_date, '%m/%d/%Y %H:%i')) 
                               FROM events e1
                               WHERE e1.Account_Number = e.Account_Number AND
                                     e1.Event_name LIKE '%Collections%')
            ) AS D on (C.Account_number = D.Account_number) 
set C.Event_date = D.Created_date, 
    C.Last_event = D.`Event_name`

Updated demo