我有一个包含这样字段的表
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>
任何人都可以帮我更新字段吗?
提前致谢!
答案 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