美好的一天开发者!
我有这个表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的行。
请帮忙。谢谢!
答案 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 - 使用组中的所有值计算聚合函数; 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
中的每一行都匹配o
中date_created
中值较大的所有行(来自o
的行是在j
之后创建的)。 LEFT JOIN
确保选中j
中的所有行,即使在j
中找不到相应的行也是如此。对于来自j
的此类行,将使用一行NULL
s来代替o
中的行。 WHERE
子句仅保留j
中NULL
o.date_created
的{{1}}行。它们是date_created
中具有最大价值的每个部门的工作(未找到具有更大值的另一行)。