【问题标题】:MySQL Limit and Order Left JoinMySQL 限制和顺序左连接
【发布时间】:2017-07-01 05:26:14
【问题描述】:

我有两个表:Processes 和 Validations; p 和 v 分别。 每个流程都有许多验证。

目标是:

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

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

我 99% 都知道查询代码。阅读了这里的一些帖子后,我相当确定我走在正确的轨道上。我的问题是我的查询仍然返回每个进程的所有结果,而不是前 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())

任何帮助将不胜感激!我可能已经很接近了,只是无法对最后一部分进行排序!

谢谢

【问题讨论】:

标签: mysql sql sorting join limit


【解决方案1】:

您的实际查询是错误的,子查询将返回验证表中的最新记录,而不是返回每个进程的最新 ID。

你应该分解以获得你需要的东西。

1)计算验证表中每个进程的最新验证:

    SELECT validation_process_id, MAX(validation_date) AS maxdate
    FROM processes_validations
    GROUP BY validation_process_id

2)对于流程表中的每个流程,获取最新的验证,并计算下一个验证日期(使用间隔 1 YEAR 而不是 365 DAY...想想闰年)

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) 过滤以仅保留本月的到期日期。这可以通过查询 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())

【讨论】:

  • 非常令人印象深刻,因为你真的没有太多事情要做。设法改造成这种格式,现在它可以按预期工作了!至于用 365 天而不是 1 年……我想我看了这么久之后我的大脑进入了白痴模式。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 2016-08-12
  • 2017-11-30
  • 1970-01-01
  • 2017-04-22
  • 2011-07-04
  • 1970-01-01
相关资源
最近更新 更多