【问题标题】:Get last update time in a status history table for a given status获取给定状态的状态历史表中的最后更新时间
【发布时间】:2021-12-30 04:06:39
【问题描述】:

我有这张桌子 order_status_history,每次更新订单时我都会插入一行,假设一个表只有列 id:

id order_id order_status_id updated_at
1 121 ready 2021-12-30 10:00:00
2 121 shipped 2021-12-30 10:01:00
3 121 ready 2021-12-30 10:02:00
4 121 shipped 2021-12-30 10:03:00
5 121 delivered 2021-12-30 10:04:00

我需要获取所有订单 (DISTINCT) 的最新 updated_at 值,这些订单 (DISTINCT) 作为最后状态已发货,或者如果已交付出于任何原因,没有已发货状态。

我写了这个查询,但我得到了 delivered 状态的最后一个 updated_at 值。在示例情况下,我需要 updated_at 作为 10:03,但我得到的是 10:04。

SELECT o.id, 
       osh.max_updated_at AS updatedAt
FROM orders o
JOIN  ( SELECT order_id, 
               Max(updatedat) AS max_updated_at
        FROM   order_status_history
        WHERE  order_status_id IN('shipped','delivered')
        GROUP  BY order_id
      ) AS osh ON osh.order_id = o.id
AND ( SELECT order_status_id
      FROM order_status_history
      WHERE  order_id = o.id
      ORDER  BY updatedat DESC
      LIMIT 1 
     ) IN('shipped','delivered')

【问题讨论】:

  • 除了发货或交付之外,还有其他状态吗?
  • select version(); 显示什么?
  • 是的,例如“取消”。或者订单可以回到库存,所以“准备好”

标签: mysql conditional-statements


【解决方案1】:

用子查询试试这个

SELECT id, (
  SELECT h.updated_at
  FROM order_status_history h
  WHERE h.order_id = o.id
  AND h.order_status_id IN ('shipped','delivered')
  AND NOT EXISTS (
    SELECT 1
    FROM order_status_history k
    WHERE k.order_id = h.order_id
    AND k.updated_at > h.updated_at
    AND k.order_status_id NOT IN ('shipped','delivered')
  )
  ORDER BY CASE WHEN order_status_id = 'shipped' THEN 1 ELSE 2 END ASC, updated_at DESC
  LIMIT 1
) AS updatedAt
FROM orders o

如果您选择单个列,则子查询有效

这是 MySQL8+ 的另一个选项

WITH ordered AS (
  SELECT *, ROW_NUMBER() OVER(PARTITION BY order_id ORDER BY CASE WHEN order_status_id = 'shipped' THEN 1 ELSE 2 END ASC, updated_at DESC) rn
  FROM order_status_history
  WHERE order_status_id IN ('shipped','delivered')
)
SELECT o.id, h.*
FROM orders o
LEFT JOIN ordered h ON o.id = h.order_id 
  AND h.rn = 1 AND NOT EXISTS (
    SELECT 1
    FROM order_status_history k
    WHERE k.order_id = h.order_id
    AND k.updated_at > h.updated_at
    AND k.order_status_id NOT IN ('shipped','delivered')
  )

【讨论】:

  • 我的子查询成功了
猜你喜欢
  • 2016-12-04
  • 2018-10-28
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 2013-01-25
相关资源
最近更新 更多