我有一个mysql表,表示通过一个复杂的同步过程从rest api同步到我的数据库的订单-由于一个错误,我现在有重复的订单,我对mysql不够熟悉,无法正确修复这个问题-我很想避免我自己可以做的"php方式"。
我的表中的重复记录有一个具有相同订单id的特定列,还有一个名为"record_state"的列,表示记录的状态(1=最新记录,2=较旧记录(我知道如何用以下语句查找重复项:
SELECT
orderid,
COUNT(orderid)
FROM
orders
WHERE `time_get` > 1584226800 AND `system` = 'live' and `record_state` = 1 and `hidden` = 0 AND `deleted` = 0
GROUP BY orderid
HAVING COUNT(orderid) > 1
我现在需要做的是更新这些结果的任何旧副本(例如count(orderid(=2(。我有一个时间栏,可以用来比较它们。对我来说,主要目标是只有最新的订单的record_state=1,旧的重复订单的record_state=2。我很乐意得到任何帮助——这是我公司的现场制作台,所以我绝对不能搞砸。提前感谢Oliver
UPDATE orders o1
SET o1.record_state = 2
WHERE ( all conditions except record_state )
AND o1.record_state != 2
AND EXISTS ( SELECT NULL
FROM orders o2
WHERE o1.orderid = o2.orderid
AND o1.time_get < o2.time_get
AND o2.record_state = 1 )
即,如果存在具有相同orderid
和record_state = 1
的最近记录,则我们使用record_state != 2
更新所有记录。
mysql表示:不允许在FROM子句部分使用o1
如果是,请尝试
UPDATE orders o1, orders o2
SET o1.record_state = 2
WHERE ( all conditions except record_state by o1 )
AND o1.record_state != 2
AND o1.orderid = o2.orderid
AND o1.time_get < o2.time_get
AND o2.record_state = 1;