mysql - 按顺序循环遍历 MySQL 表。如果值为 0,则存储其旁边的单元格值。如果不是 0 则更新为存储值

标签 mysql

我尝试了一些过程和循环,但我无法获得结果。

我有一个包含 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/

相关文章:

mysql - 解决多对一、子表在父表之前的问题

php - 如何在不丢失变量值的情况下使用多种形式?

php - 使用 Toxi 解决方案计算出现次数

php - mySQL 语法有什么问题?

mysql - 从具有相同 where 子句的多个表中进行选择

mysql - 使用分隔符将 SQL 数据拆分为 3 列

mysql - SQL 递归引用完整性

mysql - Rails 4 + ActiveRecord : How to merge data from 2 models?

mysql - 转换sql中的值后如何添加其他表中的列?

php - 过滤购物网站的搜索结果