通过保持跟踪状态删除重复的订单 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;
我有一个叫 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;