7

现在是星期五下午*,我的大脑已经停止工作。通常是我在回答这样愚蠢的 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。
我确信只是我有一个脑死亡的时刻,但我不明白为什么我的 LEFT(OUTER)JOIN 没有给我所有的工作,无论票据的价值如何。

具体来说,用户可以删除注释,因此可能完整/关闭的作业可能没有type=complete注释(状态更改时输入注释),我试图捕捉用户关闭作业时的情况,添加注释,然后删除注释。

* 东方某处

4

1 回答 1

16

由于您在子句中具有notes表的过滤器,它的作用类似于,因此将其移至条件:WHEREJOININNER JOINJOIN

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
于 2013-08-08T15:16:11.517 回答