我尝试了一些过程和循环,但我无法获得结果。
我有一个包含 19,000 条记录的表,如下所示:
id | seq | custom_id
1 | 0 | 123
2 | 0 | 124
3 | 1 | NULL
4 | 0 | 125
5 | 1 | NULL
6 | 2 | NULL
7 | 3 | NULL
我的目标是:
id | seq | custom_id
1 | 0 | 123
2 | 0 | 124
3 | 1 | 124-1
4 | 0 | 125
5 | 1 | 125-1
6 | 2 | 125-2
7 | 3 | 125-3
因此,如果 seq 为 0,它将有一个自定义 ID。如果 seq 不为 0,我想获取自定义 id 并 concat -seq 到最后。
最佳答案
- 在 Correlated Subquery ,我们可以得到前一个(也是最接近的)
custom_id
值其中seq
是 0。 - 现在,我们只需要使用
Concat()
连接前面的custom_id
的函数当前行的值seq
值,得到新的custom_id
.
尝试以下查询来选择数据 ( DB Fiddle DEMO ):
SELECT
t1.id,
t1.seq,
CASE WHEN t1.seq = 0 THEN t1.custom_id
ELSE CONCAT((SELECT t2.custom_id
FROM your_table AS t2
WHERE t2.id < t1.id AND
t2.seq = 0
ORDER BY t2.id DESC LIMIT 1), '-', t1.seq)
END AS custom_id
FROM your_table AS t1
<小时/>
但是,根据您的评论,您似乎有兴趣更新 custom_id
立即列。在 MySQL 中,可以通过 Derived Tables 在同一个表(也在更新)上使用子查询。方法。
我们确定修改后的custom_id
对于 id
哪里seq <> 0
在子选择结果集(派生表)中,然后将其Join回主表进行更新。
尝试以下方法来更新数据 ( DB Fiddle DEMO ):
UPDATE
your_table AS tab
JOIN
(
SELECT
t1.id,
CONCAT((SELECT t2.custom_id
FROM your_table AS t2
WHERE t2.id < t1.id AND
t2.seq = 0
ORDER BY t2.id DESC LIMIT 1),
'-', t1.seq) AS custom_id
FROM your_table AS t1
WHERE t1.seq <> 0
) AS dtab ON dtab.id = tab.id
SET tab.custom_id = dtab.custom_id
WHERE tab.seq <> 0;
关于mysql - 按顺序循环遍历 MySQL 表。如果值为 0,则存储其旁边的单元格值。如果不是 0 则更新为存储值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53071583/