MySQL 限价和订单左加入
MySQL Limit and Order Left Join
我有两个 table:流程和验证; p 和 v 分别。
对于 each 进程有 many 验证。
目的是:
- 检索每个进程的最新验证。
- 生成一个
下一次验证到期的动态日期 (Due_Date)(365 天
在最近的验证日期之后)。
- 将结果过滤到任何截止日期
当月的日期。
简而言之;我想查看当月要验证哪些流程。
我已完成 99% 的查询代码。阅读了这里的一些帖子后,我相当确定我走在正确的轨道上。我的问题是我的查询仍然 returns 每个进程的所有结果,而不是前 1 个。
仅供参考:进程 table 使用 "Process_ID" 作为主键;而验证 Table 使用 "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())
如有任何帮助,我们将不胜感激!我可能非常接近,只是无法对最后一部分进行排序!
谢谢
您的实际查询是错误的,子查询将 return 您验证中的最新记录 table,而不是 return 每个进程 ID 的最新记录。
你应该分解得到你需要的东西。
1)计算验证中每个进程的最新验证table:
SELECT validation_process_id, MAX(validation_date) AS maxdate
FROM processes_validations
GROUP BY validation_process_id
2) 对于进程 table 中的每个进程,获取最新的验证,并计算下一个验证日期(使用间隔 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())
我有两个 table:流程和验证; p 和 v 分别。 对于 each 进程有 many 验证。
目的是:
- 检索每个进程的最新验证。
- 生成一个 下一次验证到期的动态日期 (Due_Date)(365 天 在最近的验证日期之后)。
- 将结果过滤到任何截止日期 当月的日期。
简而言之;我想查看当月要验证哪些流程。
我已完成 99% 的查询代码。阅读了这里的一些帖子后,我相当确定我走在正确的轨道上。我的问题是我的查询仍然 returns 每个进程的所有结果,而不是前 1 个。
仅供参考:进程 table 使用 "Process_ID" 作为主键;而验证 Table 使用 "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())
如有任何帮助,我们将不胜感激!我可能非常接近,只是无法对最后一部分进行排序!
谢谢
您的实际查询是错误的,子查询将 return 您验证中的最新记录 table,而不是 return 每个进程 ID 的最新记录。
你应该分解得到你需要的东西。
1)计算验证中每个进程的最新验证table:
SELECT validation_process_id, MAX(validation_date) AS maxdate
FROM processes_validations
GROUP BY validation_process_id
2) 对于进程 table 中的每个进程,获取最新的验证,并计算下一个验证日期(使用间隔 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())