Ron*_*ovi 3 mysql greatest-n-per-group
ID | Name
1 Brain
2 Amy
Run Code Online (Sandbox Code Playgroud)
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)
那么,这样做的正确方法是什么?
您可以使用简单的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)
| 归档时间: |
|
| 查看次数: |
1729 次 |
| 最近记录: |