我正在竭尽全力生成一个会注意到正确结果的 MySQL 查询。
我有一个结构如下的表:
工作流状态历史:
id reference status
1 308ffn3oneb Lead Received
2 308ffn3oneb Quoted
3 308ffn3oneb Invoiced
4 853442ec2fc Lead Received
如您所见,workflow_status_history
表保留了我们系统中每个工作流的所有状态的历史记录,而不是用新状态替换或覆盖以前的状态。这有助于深入报告和审计。工作流的起始状态始终为 Lead Received
。
但是问题是我需要选择表中每行的reference
字段latest or only status is 已收到潜在客户
。因此在上面的示例中,字段编号 4
将返回,但是字段 1
、2
和 3
不会返回因为该工作流引用的最新状态是 Invoiced
。但是,如果 853442ec2fc
(字段编号 4
)获得了一个不同于 Lead Received
的新状态,它也不应该在下次查询运行时返回。
我目前的查询如下:
SELECT *, MAX(id) FROM workflow_status_history WHERE 'status' = 'Lead Received' GROUP BY 引用 LIMIT 20
当然,这不会返回所需的结果,因为 WHERE
子句确保它返回所有具有 Lead Received
状态的行,而不管它是什么是否是最新状态。因此它将始终返回表中前 20 个分组的工作流引用。
我将如何生成正确的查询以返回所需的结果?
感谢您的帮助。
最佳答案
这是一个左连接自身的例子。此查询中的想法是: 选择状态为“已收到潜在客户”的所有引用资料,这些引用资料中没有具有相同引用资料和更高 ID 的行。我假设您只使用 id 来确定什么是“较新”状态,没有时间戳等。
SELECT
DISTINCT h1.reference
FROM
workflow_status_history h1 LEFT JOIN workflow_status_history h2 ON
h1.reference = h2.reference AND
h1.id < h2.id
WHERE
h1.status = 'Lead Received' AND
h2.id IS NULL
关于MySQL 选择特定值的最新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47938220/