SQL Left Join, но не хочет, чтобы все записи в левой таблице - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть 2 таблицы - Проекты и Обновления статуса. В таблице Project есть поля для идентификатора, приоритета и статуса (среди прочих), а в моей таблице обновлений Status есть поля для ProjectID и даты.

Я пытаюсь создать запрос, который будет извлекать все проекты с высоким приоритетом, которые не были завершены или отменены, и сообщать мне, какие из них не имеют обновления статуса, связанного с ними за последние 14 дней.

У меня есть следующее, но оно дает мне все проекты из левой таблицы и не фильтрует высокоприоритетные проекты, статус которых не завершен или отменен.

ЛЮБАЯ ПОМОЩЬ БУДЕТ БОЛЬШОЙ ЦЕНИТЬ.

Select proj.id, proj.Priority, proj.status, proj.ProjectName,  status_tmp.statusdate,     status_tmp.statusdetail

FROM proj 

LEFT JOIN (SELECT s1.*
FROM projectstatus AS s1
LEFT JOIN projectstatus AS s2
ON s1.statusproj = s2.statusproj AND s1.statusdate < s2.statusdate

WHERE s2.statusproj IS NULL ) as status_tmp

ON (proj.id=status_tmp.statusproj)

where proj.Priority='High' AND proj.status!='Cancelled' and 
proj.status!='Completed' AND 
status_tmp.statusdate < DATE_SUB(CURDATE(),INTERVAL 14 DAY) OR 
status_tmp.statusdate IS null 

Ответы [ 2 ]

1 голос
/ 17 сентября 2011

Попробуйте поставить скобки в последней части предложения where, как показано ниже:

Select proj.id, proj.Priority, proj.status, proj.ProjectName,  status_tmp.statusdate,     status_tmp.statusdetail

FROM proj 

LEFT JOIN (SELECT s1.*
FROM projectstatus AS s1
LEFT JOIN projectstatus AS s2
ON s1.statusproj = s2.statusproj AND s1.statusdate < s2.statusdate

WHERE s2.statusproj IS NULL ) as status_tmp

ON (proj.id=status_tmp.statusproj)

where proj.Priority='High' AND proj.status!='Cancelled' and 
proj.status!='Completed' AND 

(status_tmp.statusdate < DATE_SUB(CURDATE(),INTERVAL 14 DAY) OR 
status_tmp.statusdate IS null )
0 голосов
/ 17 сентября 2011

Если ваша таблица состояния имеет только ProjectID в качестве ключа:

SELECT P.*
FROM
    proj P
        LEFT JOIN projectstatus S ON P.id = S.ProjectID
WHERE
    P.Priority = 'High'
    AND P.status NOT IN ('Cancelled', 'Completed')
    AND
        (
        S.statusdate < DATE_SUB(CURDATE(), INTERVAL 14 DAY)
        OR
        S.statusdate IS NULL
        )

В противном случае вам также потребуется фильтрация таблицы состояния для выбора самого текущего состояния (это может быть не так).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...