MySQL 修复序数序列中的间隙

MySQL Fix Gap in Ordinal Sequence

全部。我正在处理更新 table 中出现的订单图像的作业。这是通过 table 结构完成的,如下所示:product_key、image_key、image_order。前两个是其他 table 的外键,后者是图像将出现的序数序列。在选择图像的过程中,我将可用的图像与一组规则进行匹配。在某些情况下,没有符合标准集的图像会导致图像顺序出现间隙。例如,

product_key image_key image_order
5692 42265 0
5692 42207 1
5692 42210 2
5692 42212 3
5692 42266 5
5692 42273 6
5692 42268 7
5692 42264 8

这是单个 product_key 的示例,但有 1200 多个 product_key 和超过 11k 的总行。我需要做的是找到一个地方,其中 row(n) product_key 等于 row(n-1) product_key 但 row(n) image_order 不等于 row(n-1) image_order+1 然后将 row(n) 图像顺序更改为 row(n-1) image_order+1.

根据一个不再在这里工作的人的例子,我试过这个:

UPDATE mytable i
    JOIN (
        SELECT ordered_id, product_key, image_order, 
            (@ROW:=(IF(@productkey=product_key, @ROW+1, 0))) AS row_order, 
            (@productkey:=product_key) AS pid 
            FROM mytable,
                (SELECT @ROW=-1, @productkey:=-1) a 
                ORDER BY product_key, image_order) b 
            ON b.ordered_id=i.ordered_id
        SET i.image_order = b.row_order
        WHERE i.image_order <> b.row_order;

但是由于他开发它和我 运行 开发它的时间之间存在一些差异,所以将所有行中的 image_order 更新为 0。

我正在看,感觉和我需要的差不多,但我还没想好。

这是问题的DBFiddle

有没有想过如何弥补这些差距,使最终显示没有差距?

TIA

非常感谢@luuk 和@sos!这是解决方案:

insert into mytable_2 
with image_order_update_CTE (ordered_id, product_key, image, image_order, R)
as 
(
SELECT 
   m.*, 
   row_number() over (partition by product_key order by image_order)-1 R 
FROM mytable m
ORDER BY product_key
)
select image_order_update_CTE.ordered_id, image_order_update_CTE.product_key, image_order_update_CTE.image, image_order_update_CTE.image_order, image_order_update_CTE.R from image_order_update_CTE
;

我真的很感谢这个社区,再次感谢。 VtR