[英]MySQL Limit and Order Left Join
我有兩個表:流程和驗證; p 和 v 分別。 每個過程都有許多驗證。
目的是:
簡而言之; 我想看看當月需要驗證哪些流程。
我在那里有 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())
任何幫助將不勝感激! 我可能非常接近,只是無法對最后一部分進行排序!
謝謝
您的實際查詢是錯誤的,子查詢將返回驗證表中的最新記錄,而不是返回每個進程 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)過濾以僅保留本月的到期日期。 這可以通過查詢 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())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.