今天是星期五下午*,我的大脑停止工作了。通常是我在回答像这样愚蠢的 SQL 问题,抱歉!
我试图通过将后者左连接到前者来获取一个表以及另一个表的列的最大值。
SELECT
jobs.*,
MAX(notes.`timestamp`) AS complete_date
FROM jobs
LEFT JOIN notes ON (jobs.id=notes.job_id)
WHERE (jobs.status="complete" OR jobs.status="closed")
AND (notes.type="complete" OR notes.type IS NULL)
GROUP BY jobs.id
ORDER BY complete_date ASC
我正在尝试获取满足 WHERE jobs.
... 条件的所有 jobs,如果有的话,最新type=complete 的时间戳
与该工作相关的注释:
Job ID Complete Date
1 today
2 NULL
4 yesterday
作业 3 没有出现,因为它不符合 jobs.status
条件。但我实际得到的是:
Job ID Complete Date
1 today
4 yesterday
作业 2 缺失,即 JOIN 的行为类似于 INNER JOIN。
我敢肯定这只是我的脑死亡时刻,但我不明白为什么我的 LEFT(OUTER)JOIN 没有给我所有的工作,无论笔记的值(value)如何。
具体来说,用户可以删除注释,因此可能一个完整/关闭的作业可能没有 type=complete
注释(注释在状态更改时输入),我正在 try catch 用户关闭作业、添加注释然后删除注释的情况。
* 在东方某处
最佳答案
由于您在 WHERE
子句中对 notes
表进行了筛选,因此 JOIN
的行为类似于 INNER JOIN
,将其移动到JOIN
条件:
SELECT
jobs.*,
MAX(notes.`timestamp`) AS complete_date
FROM jobs
LEFT JOIN notes
ON (jobs.id=notes.job_id)
AND (notes.type="complete" OR notes.type IS NULL)
WHERE (jobs.status="complete" OR jobs.status="closed")
GROUP BY jobs.id
ORDER BY complete_date ASC;
这也可以使用子查询来完成,因此您在子查询中应用注释过滤器:
SELECT
jobs.*,
n.complete_date
FROM jobs
LEFT JOIN
(
select job_id, MAX(`timestamp`) AS complete_date
from notes
where (type="complete" OR type IS NULL)
group by job_id
) n
ON (jobs.id=n.job_id)
WHERE (jobs.status="complete" OR jobs.status="closed")
ORDER BY complete_date ASC
关于带有 LEFT JOIN 的 MySQL 聚合函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18129687/