您可以創建,抓住最大日期戳的請求ID分組(這會給你的每個請求ID的最新日期戳)的動作表派生表。獲得派生表之後,可以將其加回到Action表中具有與給定RequestID相匹配的最新DateStamp的行上的Action表。
SELECT
P.ID AS PacketID, R.ID AS RequestID, A.ID AS ActionID, A.EmpID, P.DateStamp,
RQ.Description AS RequestType, L.Description AS Line, R.PartNo, R.Workorder,
R.Qty, RZ.Description AS ReasonType, R.MTF, S.Description AS Status
FROM Packet AS P
LEFT OUTER JOIN Request AS R ON R.PacketID = P.ID
INNER JOIN
(SELECT RequestID, MAX(DateStamp) AS MostRecentDateStamp
FROM Action GROUP BY RequestID) AS MostRecentAction
ON R.ID = MostRecentAction.RequestID
INNER JOIN Action AS A
ON
MostRecentAction.RequestID = A.RequestID
AND
MostRecentAction.MostRecentDateStamp = A.DateStamp
INNER JOIN RequestType AS RQ ON R.RequestTypeID = RQ.ID
INNER JOIN Line AS L ON R.LineID = L.ID
INNER JOIN ReasonType AS RZ ON R.ReasonTypeID = RZ.ID
INNER JOIN Status AS S ON A.StatusID = S.ID
,或者另一種選擇是採取由Karwin先生這裏顯示的方法: Join single row from a table in MySQL
SELECT
P.ID AS PacketID, R.ID AS RequestID, A.ID AS ActionID, A.EmpID, P.DateStamp,
RQ.Description AS RequestType, L.Description AS Line, R.PartNo, R.Workorder,
R.Qty, RZ.Description AS ReasonType, R.MTF, S.Description AS Status
FROM Packet AS P
LEFT OUTER JOIN Request AS R ON R.PacketID = P.ID
INNER JOIN Action AS A
ON
R.ID = A.RequestID
LEFT JOIN Action AS A2
ON
A.RequestID = A2.RequestID
AND
A.DateStamp < A2.DateStamp
INNER JOIN RequestType AS RQ ON R.RequestTypeID = RQ.ID
INNER JOIN Line AS L ON R.LineID = L.ID
INNER JOIN ReasonType AS RZ ON R.ReasonTypeID = RZ.ID
INNER JOIN Status AS S ON A.StatusID = S.ID
WHERE A2.RequestID IS NULL
我喜歡Karwin先生使用方法,尤其是與結構的關係問題時像你這樣:
SELECT
P.ID AS PacketID, R.ID AS RequestID, A.ID AS ActionID, A.EmpID, P.DateStamp,
RQ.Description AS RequestType, L.Description AS Line, R.PartNo, R.Workorder,
R.Qty, RZ.Description AS ReasonType, R.MTF, S.Description AS Status
FROM Packet AS P
LEFT OUTER JOIN Request AS R ON R.PacketID = P.ID
INNER JOIN Action AS A
ON
R.ID = A.RequestID
LEFT JOIN Action AS A2
ON
A.RequestID = A2.RequestID
AND
(A.DateStamp < A2.DateStamp OR (A.DateStamp = A2.DateStamp AND A1.RequestID < A2.RequestID))
INNER JOIN RequestType AS RQ ON R.RequestTypeID = RQ.ID
INNER JOIN Line AS L ON R.LineID = L.ID
INNER JOIN ReasonType AS RZ ON R.ReasonTypeID = RZ.ID
INNER JOIN Status AS S ON A.StatusID = S.ID
WHERE A2.RequestID IS NULL
這似乎是我的情況的最佳解決方案。我唯一使用它的方法就是我對'INNER','LEFT'和'OUTER' ** JOIN **的理解程度不滿意。如果我不得不編輯這個* View *,我不會理解發生了什麼!但是,我真的很喜歡它! – jp2code
@ jp2code - 在第一個解決方案中,使用了INNER JOIN,因爲它確保在GROUP BY與它所派生的表連接時會有匹配的行。在第二種解決方案中,使用了LEFT JOIN,因爲當表與自身連接時,連接條件的狀態如下:連接有比此行更大的時間戳的行 - 並且無法滿足該條件時在具有最大DateStamp的行上),那麼你已經找到了你正在尋找的東西(A2.RequestID將是空的),並且你用WHERE子句選擇了這個。 – dugas
許多偉大的答案,併爲所有人+1。最後,我選擇了這個版本,因爲我最喜歡它的風格。是否更好,更差或等同於其他嵌套查詢版本?我真的不知道。 – jp2code