【问题标题】:MySQL aggregate functions with LEFT JOIN带有 LEFT JOIN 的 MySQL 聚合函数
【发布时间】:2013-08-08 23:16:11
【问题描述】:

现在是星期五下午*,我的大脑已经停止工作。通常是我在回答这种愚蠢的 SQL 问题,对不起!

我正在尝试通过将后者与前者 LEFT JOIN 来获取一个表以及另一个表的列的最高值。

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 注释(状态更改时输入注释),我试图在用户关闭时捕捉到这种情况作业,添加注释,然后删除注释。

*东方某处

【问题讨论】:

    标签: mysql left-join aggregate-functions


    【解决方案1】:

    由于您在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
    

    【讨论】:

    • 前半部分是我所缺少的——大脑看不到我眼前的内容,但我意识到查询需要更复杂,我将无法避免子查询。它在一小时前被写成一个子查询(仍然不工作)。哦,好吧,秋千和环形交叉路口。
    • 将条件从WHERE 子句移动到JOIN 解决了我在SQL Server 中的问题。谢谢@Taryn
    猜你喜欢
    • 2011-05-26
    • 2012-07-05
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多