如何以相反的顺序将字段更新到MYSQL表中的其他字段

时间:2015-11-24 09:34:08

标签: mysql sql database

我有一个包含这样字段的表

  

lev_1_id,lev_1_seq,lev_1_new_seq,lev_2_id,lev_2_seq,lev_2_new_seq

284e777e,1,null,b4dce5bb,1,null<br>
284e777e,1,null,dfd158ed,2,null<br>
284e777e,1,null,fedbf511,3,null<br>
0c7e0938,2,null,2333f431,1,null<br>
0c7e0938,2,null,808734fa,2,null<br>
0c7e0938,2,null,2504e0de,3,null<br>

现在我想通过分别反转lev_1_seq和lev_2_seq中的值来更新lev_1_new_seq和lev_2_new_seq。

更新字段后,表格应如下所示:

  

lev_1_id,lev_1_seq,lev_1_new_seq,lev_2_id,lev_2_seq,lev_2_new_seq

284e777e,1,2,b4dce5bb,1,3<br>
284e777e,1,2,dfd158ed,2,2<br>
284e777e,1,2,fedbf511,3,1<br>
0c7e0938,2,1,2333f431,1,3<br>
0c7e0938,2,1,808734fa,2,2<br>
0c7e0938,2,1,2504e0de,3,1<br>

任何人都可以帮我更新字段吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

看来你应该能够计算出新的&#34;序列通过从相关的最大值+ 1中扣除出现的序列。

e.g。 max(lev_1_seq)+ 1 = 3,因此对于现有值2:3-2 = 1,对于现有值1:3-1 = 2

UPDATE table1 tu
JOIN (
      SELECT
            t1.lev_1_id
          , m1.lev1maxseq
          , MAX(t1.lev_2_seq) + 1 lev2maxseq
      FROM table1 t1
            CROSS JOIN (
                  SELECT
                        MAX(lev_1_seq) + 1 lev1maxseq
                  FROM table1
            ) m1
      GROUP BY
            t1.lev_1_id
          , m1.lev1maxseq
      ) nv on tu.lev_1_id = nv.lev_1_id
SET
    tu.lev_1_new_seq = (nv.lev1maxseq - tu.lev_1_seq)
  , tu.lev_2_new_seq = (nv.lev2maxseq - tu.lev_2_seq)
;

请参阅此sqlfiddle

结果:

| lev_1_id | lev_1_seq | lev_1_new_seq | lev_2_id | lev_2_seq | lev_2_new_seq |
|----------|-----------|---------------|----------|-----------|---------------|
| 284e777e |         1 |             2 | b4dce5bb |         1 |             3 |
| 284e777e |         1 |             2 | dfd158ed |         2 |             2 |
| 284e777e |         1 |             2 | fedbf511 |         3 |             1 |
| 0c7e0938 |         2 |             1 | 2333f431 |         1 |             3 |
| 0c7e0938 |         2 |             1 | 808734fa |         2 |             2 |
| 0c7e0938 |         2 |             1 | 2504e0de |         3 |             1 |

答案 1 :(得分:0)

如果初始排序是由id完成的,则此解决方案有效。 2 - 您更新的列,1 - 需要按相反顺序排列的列,tmp - 表格,id - 唯一键,初始排序列。

BEGIN
DECLARE p INT;
DECLARE v INT;
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT COUNT(*) FROM `tmp` INTO n;
SET i=0;
WHILE i<n DO 
  select `1` from `tmp` order by `id` desc limit i,1 into p;
  select `id` from `tmp` order by `id` limit i,1 into v;

  update `tmp` set `2` = p where `id` = v;
  SET i = i + 1;
END WHILE;
End

对于您的表:1 = lev_1_seq,2 = lev_1_new_seq,id = lev_1_id