我已经搜索了该站点并尝试了许多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”。
如果需要更多信息,请告诉我。任何帮助将不胜感激。
以下是示例数据:
事件表:
杰出表:
预期结果:
这是表结构:
答案 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
更新
基于提供的小提琴,表中的日期实际上是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`