您可以创建,抓住最大日期戳的请求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