【问题标题】:MySQL LEFT JOIN only 1 row depending on MAX() valueMySQL LEFT JOIN 仅 1 行取决于 MAX() 值
【发布时间】:2019-08-23 05:17:18
【问题描述】:

表 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'

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

【问题讨论】:

  • “获取表 1 的所有字段并在表 2 上左连接,但只有最新的 WorkDay 值”不清楚。使用足够多的单词、句子和对部分示例的引用来清楚完整地表达你的意思。在描述结果时:说足够多的人可以离开并带着解决方案回来。请在代码问题中给出minimal reproducible example--cut & paste & runnable code 加上所需的输出加上清晰的规范和解释。因此,给出您所展示的最少代码可以满足您的期望,并且在您出错的第一个地方提供最少的代码。 (调试基础。)

标签: mysql greatest-n-per-group


【解决方案1】:

这也输出相同,但请注意@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;

【讨论】:

    【解决方案2】:

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

    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)
    

    输出:

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

    Demo on dbfiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多