2017-02-13 59 views
1

我有两个表:进程和验证; p和v。 对于每个进程有许多验证。MySQL限制和订单左连接

目的是:

  • 检索每个进程的最新验证
  • 生成一个 动态日期(Due_Date),以确定下一次验证何时到期(即最近验证日期后的365天 )。
  • 将结果过滤为当前月份中应有的任何到期日期 。

简而言之;我想看看哪些流程将在当月进行验证。

我99%与查询代码。阅读了这里的一些帖子后,我相当肯定我在正确的轨道上。我的问题是,我的查询仍然返回每个进程的所有结果,而不是顶端1.

1供参考:进程表使用“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()) 

任何帮助,将彻底感激!我可能非常接近,只是无法排序最后一节!

感谢

+1

见http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an -mcve-for-what-looks-to-the-very-simple-sql-query – Strawberry

+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)过滤器只有杜保持本月e_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()) 
+0

考虑到你真的没有太多的事情要做,所以令人印象深刻。管理重做这种格式,现在它的工作是希望的!至于使用365天而不是1年......我想我的大脑长时间看着它进入白痴模式。谢谢! – billcox33