0

我正在尝试从两个表中提取数据,其中我需要第一个表中的每一列和第二个表中特定 id 的最后一行。我有以下查询

SELECT RequestTable.*,
   ProcessTable.processType,
   ProcessTable.employeeId,
   ProcessTable.processId
FROM RequestTable,
   ProcessTable
WHERE RequestTable.requestId = ProcessTable.requestId
ORDER BY ProcessTable.processId DESC LIMIT 1;

现在,由于 LIMIT 1,这仅返回一个条目。如何更改此查询,以便它说出以下内容:

SELECT RequestTable.*,
   ProcessTable.processType,
   ProcessTable.employeeId,
   ProcessTable.processId
FROM RequestTable,
   ProcessTable
WHERE RequestTable.requestId = ProcessTable.requestId
   AND * * * * ProcessTable.processType IS
FROM THE LAST ROW
FROM ProcessTable
WHERE ProcessTable.requestId = RequestTable.requestId

我基本上是在记录对状态的更改,我需要为给定的 id 提取最后插入的状态。

任何帮助将不胜感激。

4

1 回答 1

0

您正在谈论的两个表分别是RequestTableProcessTable?您想要每个请求和每个请求的最新流程步骤吗?

首先,您需要编写一个查询ProcessTable,每个requestId. 在不知道您的架构的情况下,我只能猜测它看起来像这样:

SELECT
    RequestID, ProcessType, EmployeeID, ProcessID
FROM
    ProcessTable AS PT
WHERE
    -- Exclude this record if there is another with the same RequestID but a later ProcessID
    NOT EXISTS (SELECT * FROM ProcessTable AS PT2 WHERE PT.RequestID = PT2.RequestID AND PT2.ProcessID > PT.ProcessID)

这假设ProcessID是一个递增的整数,因此最近的记录将始终具有最高的ProcessID

完成后,我们可以轻松地将其连接到第一个表,作为子查询:

SELECT
    RT.*,
    PT.ProcessType,
    PT.EmployeeID,
    PT.ProcessID
FROM
    RequestTable AS RT
    INNER JOIN
        (
        SELECT
            RequestID, ProcessType, EmployeeID, ProcessID
        FROM
            ProcessTable AS PT
        WHERE
            NOT EXISTS (SELECT * FROM ProcessTable AS PT2 WHERE PT.RequestID = PT2.RequestID AND PT2.ProcessID > PT.ProcessID)
        ) AS PT ON RT.RequestID = PT.RequestID
ORDER BY
    PT.ProcessID

注意:不要在WHERE子句中加入你的表,这是自找麻烦(曾经不小心交叉加入两百万行记录?哎哟)。将您的连接逻辑放在FROM子句中,这就是它所属的地方。

于 2013-10-04T22:46:28.143 回答