SQL排序依据在左联接中选择

时间:2020-02-20 22:37:36

标签: mysql sql mariadb

我有一个包含两个表的系统。一个“项目”表和一个“附加项”表。 项目表包含“项目”的原始数据。项目的详细信息无法直接更改。如果需要更改任何细节,则使用“添加”。这样,就可以维护项目中的原始条目,并在添加项目时按顺序跟踪所有更改。

项目字段之一是“ 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个示例附加内容

sample project

sample additions for project id 590

以上查询的结果为2020-02-12的realClosingDate,但是需求结果应为2020-02-22,因为这是最新输入的加法,但不一定是additionEndDate的MAX()

1 个答案:

答案 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`