MySQL 限价和订单左加入

MySQL Limit and Order Left Join

我有两个 table:流程和验证; p 和 v 分别。 对于 each 进程有 many 验证。

目的是:

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

我已完成 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())