[英]MySQL LEFT JOIN only 1 row depending on MAX() value
ID | Name
1 Brain
2 Amy
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
對於課程的第一行,它返回確定:
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'
那么,正確的方法是什么?
您可以對table2
使用簡單的JOIN
,只需將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
這也輸出相同,但請注意@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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.