现在是星期五下午*,我的大脑停止了工作。通常是我这样回答愚蠢的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.
…标准的工作,如果有,则为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。
我敢肯定,这只是我脑筋急转弯的一刻,但我不明白为什么不管钞票的面额如何,我的左(外)联接都不给我所有工作。
具体来说,用户可以删除便笺,因此潜在的情况是,已完成/已关闭的作业上可能没有type=complete
便笺(状态更改时便会输入便笺),我试图抓住用户关闭工作并添加便笺的情况,然后删除便笺。
*在东方的某个地方
由于您notes
在WHERE
子句中有用于表格的过滤器,因此其JOIN
行为类似于an 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;
也可以使用子查询来完成此操作,因此您可以在子查询中应用notes过滤器:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句