2015-11-24 52 views
1

我有這樣的如何在MySQL表更新以相反的順序其他字段的字段

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> 

誰能幫我更新的領域?

在此先感謝!

+1

使用Excel來做到這一點。將數據複製到Excel中,然後手動創建更新語句 – User2012384

+0

請解釋期望的輸出.. –

+0

@SubinCPoonamgode我想更新字段lev_1_new_seq和lev_2_new_seq,它們必須是lev_1_seq和lev_2_seq字段的反向值。 因此,對於level_1_seq,只有一個序列集合,即1,2個預期的這個字段是2,1。 但是對於lev_2_seq,在lev_1_seq中存在兩個用於值1的序列集合,而在lev_2_seq中存在兩個用於值2的序列集合。我想要一個單獨的反向序列的兩套。 – Arunraj

回答

0

看樣子,你應該能夠從相關的最大值+ 1

如扣除退出序列來計算「新」序列最大(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 | 
+0

我看到這個邏輯可以滿足我的要求,但是我使用上面的查詢來更新序列,lev_1_seq正在更新,但是lev_2_seq對於所有行更新爲「1」。我還調查了查詢,這是因爲t1.lev_1_id ,m1.lev1maxseq ,t1.lev_2_id。在這裏,當使用lev_2_id時,最大值不能正確返回。你能建議改變上述查詢嗎? – Arunraj

+0

是的,我在分組子查詢中刪除了lev_2_id,現在我可以測試它了(因爲sqlfiddle今天正在工作) –

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

相關問題