MySQL LEFT JOIN 仅 1 行取决于 MAX() 值

Ron*_*ovi 3 mysql greatest-n-per-group

表格1

ID | Name
1    Brain
2    Amy
Run Code Online (Sandbox Code Playgroud)

表 2:

ID | WorkDay    | MissionCode
1    2019-01-01    2360
1    2019-02-01    2470
2    2019-01-01    4470
2    2019-02-01    7210
Run Code Online (Sandbox Code Playgroud)

我想要实现的是,我想获取所有表 1 字段并在表 2 上左连接,但只有最新的 WorkDay 值,如下所示:

预期结果

ID | Name | WorkDay    | MissionCode
1    Brain  2019-02-01   2470
2    Amy    2019-02-01   7210
Run Code Online (Sandbox Code Playgroud)

到目前为止我尝试过的是:

SELECT 
    table1.*, t2.WorkDay, t2.MissionCode
FROM 
    table1
LEFT JOIN
    (SELECT
        *
     FROM
        table2
     ORDER BY
        WorkDay DESC
     LIMIT 0,1) AS t2
ON
   t2.id = table1.id
Run Code Online (Sandbox Code Playgroud)

但它从 table2 返回 NULL 值,如下所示:

ID | Name | WorkDay    | MissionCode
1    Brain  NULL         NULL
2    Amy    NULL         NULL
Run Code Online (Sandbox Code Playgroud)

我测试了相同的查询,向内部联接的 select 命令添加了额外的 WHERE 子句,并且成功了。

SELECT 
    table1.*, t2.WorkDay, t2.MissionCode
FROM 
    table1
LEFT JOIN
    (SELECT
        *
     FROM
        table2
     **WHERE id = 1**
     ORDER BY
        WorkDay DESC
     LIMIT 0,1) AS t2
ON
   t2.id = table1.id
Run Code Online (Sandbox Code Playgroud)

对于第一行,它返回正常:

ID | Name | WorkDay    | MissionCode
1    Brain  2019-02-01   2470
2    Amy    NULL         NULL
Run Code Online (Sandbox Code Playgroud)

但是我不能用

WHERE id = table1.id 
Run Code Online (Sandbox Code Playgroud)

因为 MySQL 说

Unknown column 'table1.id' in 'where clause'
Run Code Online (Sandbox Code Playgroud)

那么,这样做的正确方法是什么?

Nic*_*ick 7

您可以使用简单的JOINto table2,只需将条件作为相关子查询MAX(WorkDay)放入JOIN条件中,您可以在其中访问table1id 值:

SELECT *
FROM table1 t1
JOIN table2 t2 ON t2.id = t1.id AND
                  t2.WorkDay = (SELECT MAX(WorkDay) 
                                FROM table2 
                                WHERE table2.id = t1.id)
Run Code Online (Sandbox Code Playgroud)

输出:

ID  Name    ID  WorkDay     MissionCode
1   Brain   1   2019-02-01  2470
2   Amy     2   2019-02-01  7210
Run Code Online (Sandbox Code Playgroud)

dbfiddle 上的演示