通过保持跟踪状态删除重复的订单 ID - mysql

Delete duplicate order ids by keeping the tracking status - mysql

我有一个叫 tracking_history 的 table。在此 table 中将存储包裹跟踪历史记录。由于某些原因,当 checkTrackStatus 函数执行时,所有现有的跟踪状态都会重复插入 table。这是跟踪状态序列。 'ACCEPTED','AT_SENDING_DEPOT','ON_THE_ROAD','AT_DELIVERY_DEPOT','DELIVERED' 我也在 table 中保存了跟踪 ID 和订单 ID。所以我需要为每个订单 ID 提供最新的跟踪状态 ('ACCEPTED','AT_SENDING_DEPOT','ON_THE_ROAD','AT_DELIVERY_DEPOT','DELIVERED'),并且应该删除剩余的重复值。我尝试了以下查询。

`DELETE t1 FROM tracking_history t1, tracking_history t2 
WHERE t1.id < t2.id AND t1.order_id = t2.order_id` 

但此查询仅保留最新记录并删除剩余的所有其他记录。 Means I am having all orders ids with DELIVERED Status only. 如何通过保留最新状态来删除重复状态?任何帮助将不胜感激。

您需要关于状态的附加关联子句:

DELETE t1 
FROM tracking_history t1
INNER JOIN tracking_history t2 
    ON  t1.id < t2.id 
    AND t1.order_id = t2.order_id
    AND t1.status = t2.status

我建议进一步更改查询,如下所示:

DELETE t1 
FROM tracking_history t1
INNER JOIN (
    SELECT order_id, status, MAX(id) as id 
    FROM tracking_history 
    GROUP BY order_id, status
) t2 
    ON  t1.id < t2.id 
    AND t1.order_id = t2.order_id
    AND t1.status = t2.status

这种方法的好处是每行只匹配一次,与原始查询相反,原始查询可能会多次尝试删除同一行。因此,这更有效 - 而且更安全。

我希望在插入行时保留 first id 而不是 last id。这是因为其他可能有用的信息——特别是插入时间和插入者。为此,我会为每个状态保留一行,但将逻辑表述为:

delete th
    from tracking_history th join
         (select order_status, status, min(id) as min_id
          from tracking_history th2
          group by order_status, status
         ) th2
         using (order_status, status)
    where id > min_id;

话虽如此,这似乎还是不对。毕竟,多行的状态可能相同。例如,可能会多次尝试将包裹从仓库移动到某个地址。您真正想要的是 tracking_history 中每批 的最新状态 。我不知道您是否有某种“批次 ID”。但是让我假设有一些东西,可能是一个进入日期,将所有共同的价值观联系在一起。

在这种情况下,您需要每个“批次”的 最新 状态:

delete th
    from tracking_history th join
         (select order_status, entry_date, max(id) as max_id
          from tracking_history th2
          group by order_status, entry_date
         ) th2
         using (order_status, entry_date)
    where id < min_id;