带有 LEFT JOIN 的 MySQL 聚合函数

标签 mysql left-join aggregate-functions

今天是星期五下午*,我的大脑停止工作了。通常是我在回答像这样愚蠢的 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/

相关文章:

mysql - 如何使用左连接来使用聚合函数?数据库

sql - sas sql 第一个 obs 最后一个 obs

PHP MySQL LEFT JOIN 不工作

sql - 选择组上每个组的最大记录

具有两个连接的查询中的 mysql 聚合函数给出了意想不到的结果

php - 如何在 Jquery 表格中显示图像?

无论我做什么,PHP 都会将变量设置为数组?

php - 将多条记录从复选框更新到数据库

mysql - SQL如何计算所有行的最大值

android - 如何使用 contextMenu 将值从 ListView 传递到项目的另一个 Activity