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
全部。我正在处理更新 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