MySQL LEFT JOIN только 1 строка в зависимости от значения MAX () - PullRequest
0 голосов
/ 02 апреля 2019

Таблица 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

Но он возвращает значения NULL из таблицы2, например:

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

Я протестировал тот же запрос, добавив дополнительное предложение WHERE к команде select внутреннего соединения, и он успешно завершился.

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

И он возвращается нормально, для первого ряда курса:

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 ]

3 голосов
/ 02 апреля 2019

Вы можете использовать простые JOIN до table2, просто поместите условие 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

Демонстрация на dbfiddle

0 голосов
/ 02 апреля 2019

Это также выводит то же самое, но обратите внимание, что ответ Ника лучше.
---------- 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;
...