我有两个表:进程和验证;分别为p和v。 对于每个流程,都有多次验证。
目的是:
简而言之;我想看看哪些流程将在当月验证。
我99%有查询代码。通读了这里的一些帖子,我相当肯定我在正确的轨道上。我的问题是我的查询仍然返回每个进程的所有结果,而不是前1个。
FYI:流程表使用" Process_ID"作为主键;而验证表使用" Validation_Process_ID"作为外键。
目前的代码:
Select p.Process_ID,
p.Process_Name,
v.Validation_Date,
Date_Add(v.Validation_Date, Interval 365 Day) as Due_Date
From processes_active p
left JOIN processes_validations v
on p.Process_ID = (select v.validation_process_id
from processes_validations
order by validation_date desc
limit 1)
Having Month(Due_Date) = Month(Now()) and Year(Due_Date) = Year(Now())
任何帮助都将非常感谢!我可能非常接近,不能排序最后一节!
由于
答案 0 :(得分:1)
您的实际查询错误,子查询将返回验证表中的最新记录,而不是返回最新的每个进程ID。
你应该分解以获得你需要的东西。
1)计算验证表中每个流程的最新验证:
SELECT validation_process_id, MAX(validation_date) AS maxdate
FROM processes_validations
GROUP BY validation_process_id
2)对于流程表中的每个流程,获取最新的验证,并计算下一个验证日期(使用间隔1年而不是365天......想想闰年)
SELECT p.Process_ID, p.Process_Name, v.maxdate,
Date_Add(v.maxdate, Interval 1 year) as Due_Date
FROM processes_active p
LEFT JOIN
(
SELECT validation_process_id, MAX(validation_date) AS maxdate
FROM processes_validations
GROUP BY validation_process_id
)
ON p.Process_ID = v.validation_process_id
3)过滤以保留本月的due_date。这可以通过查询2上的WHERE来完成,我只是为您的理解做一个嵌套查询
SELECT * FROM
(
SELECT p.Process_ID, p.Process_Name, v.maxdate,
Date_Add(v.maxdate, Interval 1 year) as Due_Date
FROM processes_active p
LEFT JOIN
(
SELECT validation_process_id, MAX(validation_date) AS maxdate
FROM processes_validations
GROUP BY validation_process_id
)
ON p.Process_ID = v.validation_process_id
) T
WHERE Month(Due_Date) = Month(Now()) and Year(Due_Date) = Year(Now())