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



我有一个名为tracking_history的表。包裹跟踪历史记录将存储在该表中。由于某些原因,当checkTrackStatus函数执行时,所有现有的跟踪状态都会重复插入到表中。以下是跟踪状态序列。'ACCEPTED','AT_SENDING_DEPOT','ON_THE_ROAD','AT_DELIVERY_DEPOT','DELIVERED'我正在保存跟踪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.如何通过保留最新状态来消除重复状态?如有任何帮助,我们将不胜感激。

插入行时,我希望保留第一个id,而不是最后一个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;

您想要一个关于状态的附加关联子句:

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

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

最新更新