MySQL 选择特定值的最新行

标签 mysql

我正在竭尽全力生成一个会注意到正确结果的 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 将返回,但是字段 123 不会返回因为该工作流引用的最新状态是 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/

相关文章:

mysql - 使用第二个 INNER JOIN 或在第二个 INNER JOIN 之前对两个表进行 INNER JOIN 的 SQL

mysql - In 从句与 And 操作

python - 尝试将字符串插入 SQL Server 的问题

mysql - 确保值的组合是唯一的,但输入任意次数 - Mysql

python - Flask Rest API 没有看到更新的表?

php - 删除和重新索引数组时遇到问题

mysql - 我可以在一个查询中使用 different 和 "in"吗?

php - 显示 MySQL 中的原始数据和重复数据

mysql - 如何选择具有lastname.firstname模式的所有ID

c# - 30 秒后连接超时