我有一个包含两个表的系统。一个“项目”表和一个“附加项”表。 项目表包含“项目”的原始数据。项目的详细信息无法直接更改。如果需要更改任何细节,则使用“添加”。这样,就可以维护项目中的原始条目,并在添加项目时按顺序跟踪所有更改。
项目字段之一是“ projectEndDate”,其中包含项目的结束日期。可以使用带有“ additionEndDate”的附加项来覆盖它。添加项还包含“ additionDateEntered”,该日志记录将添加项实际输入到系统中的时间。
我需要能够抓住所有项目,同时加入包含由最新“ additionDateEntered”排序的新endDate的添加项,并获取该条目的“ additionEndDate”。最后,整个结果应按“ realClosingDate”排序,它是最新结束日期的别名。通常,我可以解决这些查询,但是我似乎真的很难解决这个问题。
这是我到目前为止所拥有的
SELECT
*,
`additionEndDate`,
GREATEST(COALESCE(`projectEndDate`, 0),
COALESCE(`additionEndDate`, 0)) AS `realEndDate`
FROM
(SELECT
*
FROM
`projects`
WHERE
`projectStatus` = ‘Active’) AS A
LEFT JOIN
(SELECT
*
FROM
`additions`
WHERE
`additionEndDate` IS NOT NULL
GROUP BY `projects_projectId`
ORDER BY `additionEnteredDate` DESC) AS B ON A.projectId = B.projects_projectId
ORDER BY `realEndDate`
结果没有获得最新的additionalEnteredDate,而是似乎仅获得了附加项中的第一个条目。
编辑: 这是一个示例项目,与该项目相关的4个示例附加内容
以上查询的结果为2020-02-12的realClosingDate
,但是需求结果应为2020-02-22,因为这是最新输入的加法,但不一定是additionEndDate
的MAX()
答案 0 :(得分:1)
这回答了原始问题。
SELECT *
和GROUP BY
!那只是一个错误。而且最新版本的MySQL甚至不允许它。
它至少使逻辑易于修复:
SELECT p.*, a.max_additionEndDate,
GREATEST(COALESCE(p.projectEndDate, a.max_additionEndDate),
COALESCE(a.max_additionEndDate, p.projectEndDate)
) as realEndDate
FROM projects p LEFT JOIN
(SELECT a.projects_projectId, MAX(additionEndDate) as max_additionEndDate
FROM additions` a
GROUP BY projects_projectId
) a
ON a.projectId = p.projects_projectId
WHERE p.projectStatus = 'Active'
ORDER BY `realEndDate`