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

时间:2019-04-02 00:26:20

标签: mysql greatest-n-per-group

表1

ID | Name
1    Brain
2    Amy

表2:

ID | WorkDay    | MissionCode
1    2019-01-01    2360
1    2019-02-01    2470
2    2019-01-01    4470
2    2019-02-01    7210

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

预期结果

ID | Name | WorkDay    | MissionCode
1    Brain  2019-02-01   2470
2    Amy    2019-02-01   7210

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

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

但是它从table2返回NULL值,像这样:

ID | Name | WorkDay    | MissionCode
1    Brain  NULL         NULL
2    Amy    NULL         NULL

我测试了相同的查询,在内部联接的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

对于课程的第一行,它返回OK:

ID | Name | WorkDay    | MissionCode
1    Brain  2019-02-01   2470
2    Amy    NULL         NULL

但是我不能使用

WHERE id = table1.id 

因为MySQL说

Unknown column 'table1.id' in 'where clause'

那么,正确的方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以使用简单的JOINtable2,只需将MAX(WorkDay)条件作为相关子查询放入JOIN条件中,即可访问{{1 }} id值:

table1

输出:

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)

Demo on dbfiddle

答案 1 :(得分:0)

这也输出相同,但请注意@Nick的答案更好
---------- 1 ------------

select
  t1.id,t1.name,t2.workday,t2.Missioncode
  from t1
  left join t2 on 
  t1.id=t2.id
  and t2.workday =(select max(workday) from t2 );

---------- 2 ------------

 select t1.id,t1.name,
  (select max(workday) from t2 where t2.id=t1.id)as workday,
  (select max(MissionCode) from t2 where t2.id=t1.id)as missioncode
  from t1;