MySQL限制和订单左连接

时间:2017-02-13 09:17:18

标签: mysql sql sorting join limit

我有两个表:进程和验证;分别为p和v。 对于每个流程,都有多次验证。

目的是:

  • 检索每个进程的最新验证
  • 生成一个 关于下一次验证到期的动态日期(Due_Date)(365天 在最后的验证日期之后)。
  • 将结果过滤到任何到期日 本月的日期。

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

我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())

任何帮助都将非常感谢!我可能非常接近,不能排序最后一节!

由于

1 个答案:

答案 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())