SQL Сортировать по в левом соединении Выбрать - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть система, которая содержит две таблицы. Таблица «проекты» и таблица «дополнения». Таблица проектов содержит исходные данные для «проекта». Детали проекта не могут быть изменены напрямую. Вместо этого используется «дополнение», если необходимо изменить какие-либо детали. Таким образом сохраняется исходная запись в проектах, и по мере добавления дополнений все изменения можно отслеживать по порядку.

Одним из полей проекта является «projectEndDate», которое содержит дату окончания проекта. Это можно переопределить добавлением с помощью «extensionEndDate». В Additions также содержится «extensionDateEntered», которое регистрирует фактическое добавление дополнения в систему.

Мне нужно иметь возможность захватить все проекты, оставляя присоединение к дополнениям, содержащим новую endDate, упорядоченную по новейшей версии дополнения »extensionDateEntered "и получая" extensionEndDate "для этой записи. И чтобы завершить, все результаты должны быть упорядочены по «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`

Результат не получает последнее добавлениеEnteredDate, а вместо этого кажется получить первую запись только в дополнениях.

РЕДАКТИРОВАТЬ: Вот пример проекта и 4 примера дополнений, связанных с этим проектом

sample project

sample additions for project id 590

Приведенный выше запрос приводит к realClosingDate от 2020-02-12, однако требуемый результат должен быть 2020-02-22, так как это последнее введенное добавление, но не обязательно МАКС () additionEndDate

1 Ответ

1 голос
/ 21 февраля 2020

Это отвечает на оригинальный вопрос.

SELECT * с GROUP BY !!! Это просто ошибка. А самые последние версии MySQL даже не позволяют этого.

Это по крайней мере делает логику c легкой для исправления:

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`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...