尝试将来自特定行的数据包含为“父”查询的输入

时间:2013-10-04 21:13:11

标签: mysql sql

我正在尝试从两个表中提取数据,其中我需要第一个表中的每一列以及第二个表中特定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提取最后插入的状态。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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子句中,即它所属的位置。