按顺序遍历mysql表如果值为0,则在其旁边存储单元格值如果不是0,则更新存储值

70gysomp  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(195)

我已经尝试了一些程序和循环,但是我很难得到我的结果。
我有一张19000条记录的表格,看起来像这样:

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的结尾。

2wnc66cl

2wnc66cl1#

在相关子查询中,我们可以得到前一个(和最近的) 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中,通过派生表方法,可以在同一个表上使用子查询(该表也正在更新)。
我们确定修改的 custom_id 为了 id 哪里 seq <> 0 在子表中选择结果集(派生表),然后将其联接回主表进行更新。
尝试以下更新数据(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;

相关问题