获得每个部门的最新记录

时间:2016-03-24 08:43:42

标签: mysql sql

美好的一天开发者!

Image 1

我有这个表JOBS,我想得到每个部门的最新记录。

如您所见,只有2个部门。输出行应为ID的# 1和6

我尝试使用此

SELECT j.id, j.title, j.department_id, j.date_created
FROM JOBS j
WHERE Date = (SELECT MAX(Date) FROM JOBS WHERE id = j.id)
GROUP BY j.department_id 

但我得到了ID#1和3的行。

请帮忙。谢谢!

5 个答案:

答案 0 :(得分:2)

使用IN()

SELECT j.id, j.title, j.department_id, j.date_created
FROM JOBS j
WHERE (date_created,department_id) IN (SELECT MAX(Date),department_id FROM 
                                      group by department_id)

NOT EXISTS()

SELECT * FROM JOBS t
WHERE NOT EXISTS(SELECT 1 FROM JOBS s
                 WHERE s.department_id = t.department_id
                   AND s.date_created > t.date_created)

或使用左连接:

SELECT t.* FROM JOBS t
LEFT OUTER JOIN JOBS s
 ON(t.department_id = s.department_id AND s.date_created > t.date_created)
WHERE s.id is null

答案 1 :(得分:1)

使用subquery的一个解决方案:

SELECT j.id, j.title, j.department_id, j.date_created
FROM JOBS j
WHERE (department_id, Date) IN 
    (SELECT department_id, MAX(date_created) FROM JOBS WHERE department_id = j.department_id)

这也可以改写为JOIN

答案 2 :(得分:1)

使用带MAX和内部连接的子查询

SELECT j.id, j.title, j.department_id, j.date_created, q.time_stamp
    FROM JOBS j
    Inner Join (
     Select id,title
              ,max(Date) as time_stamp
        From JOBS 
        Group By id, title)As q

        On j.id = q.id
    And j.date_created = q.time_stamp

答案 3 :(得分:1)

SELECT * FROM JOBS 
INNER JOIN 
(
    SELECT departmen_id,MAX(date_created) as maxdate FROM JOBS
    GROUP BY department_id
) AS maxdates
ON JOBS.department_id=maxdates.department_id
AND JOBS.date_created=maxdates.maxdate

答案 4 :(得分:0)

您尝试的查询是无效的SQL。它被MySQL接受,但它为GROUP BY子句are indeterminate中没有出现的表达式返回的值。

这样的查询没有返回您期望的原因很简单:GROUP BY不适用于表行。它会生成新行。它使用WHERE子句使用GROUP BY子句中的表达式从使用SELECT子句过滤的行创建组。对于这样的每个组,它计算SELECT子句中每个表达式的值,每个表达式独立于其他表达式。

GROUP BY子句中,您可以使用:

  • GROUP BY子句中存在的表达式;它们中的每一个都为一组中的所有记录生成相同的值(因为这是创建组的方式,不是吗?);
  • GROUP BY aggregate functions - 使用组中的所有值计算聚合函数;
  • 自MySQL 5.7.5:包含非聚合列的表达式,这些列在功能上依赖于GROUP BY子句中出现的列。

在版本5.7.5之前,MySQL用于接受在功能上不依赖于JOIN(您的情况)中出现的表达式的列,但它在文档中明确指出为此类列生成的值是不定。它是从组中存在的值中选择的,但它既不是第一个,也不是最后一个,它是随机的。

使用相同的输入数据运行两次这样的问题会产生不同的结果;这种情况发生在MySQL出于某种原因重新组织查询中包含的表的数据之后(例如,当它在另一台服务器上移动或从备份中恢复时)。

生成所需结果的正确方法之一

有几种方法可以获得所需的结果。其中一些显示在其他答案中。我更喜欢MAX使用您用于分组的列以及您想要SELECT j.id, j.title, j.department_id, j.date_created FROM JOBS j LEFT JOIN jobs o USING (department_id) AND j.date_created < o.date_created WHERE o.date_created IS NULL 的列的条件来对照自己的表:

JOIN

工作原理:

j表格(来自&#34;作业&#34;的别名为o;这是您想要在输出中得到的作业)对象(别名为{{1}来自&#34;其他&#34;)。 j中的每一行都匹配odate_created中值较大的所有行(来自o的行是在j之后创建的)。 LEFT JOIN确保选中j中的所有行,即使在j中找不到相应的行也是如此。对于来自j的此类行,将使用一行NULL s来代替o中的行。 WHERE子句仅保留jNULL o.date_created的{​​{1}}行。它们是date_created中具有最大价值的每个部门的工作(未找到具有更大值的另一行)。