2015-07-21 71 views
0

我一直在試圖找到一個解決方案,發現了幾個類似的帖子,但沒有人回答我的問題。從選擇增量mysql更新

我有一個設計糟糕的表,存儲排序索引。在編程時,我們會在人們對一些數據進行排序時更新該索引問題是,現在索引看起來像1, 2, 2, 3, 6, 6, 7, 8, 8, etc,所以我負責解決這個問題。我修復了代碼,所以這不再發生,但我如何更新數據庫?我有一個表:

+---------+-------+---------+ 
| otherId | index | product | 
| 3423 | 1  | zbhdfji | 
| 63453 | 3  | fgdfgr | 
| 75454 | 3  | drhfef | 
+---------+-------+---------+ 

我需要它像:

+---------+-------+---------+ 
| otherId | index | product | 
| 3423 | 1  | zbhdfji | 
| 63453 | 2  | fgdfgr | 
| 75454 | 3  | drhfef | 
+---------+-------+---------+ 

我想是這樣的:

update table set index = @rownum where otherId in (select other_id FROM table where index <= 200 order by index asc); 

但它不喜歡我是從同一拉表,我甚至不知道它是否會工作。有任何想法嗎?

+0

它如何對相同索引進行排序?我正確地想用'otherId'升序排序嗎? – MaHDyfo

+0

哈哈我說設計糟糕的桌子。沒有遞增的ID。 「otherId」似乎是唯一的,但它來自不同的表格,因此不會增加或類似的東西。關於對相同的索引進行排序......它不...只對排序在代碼中看到的排序是通過索引asc對其進行排序並將其限制爲200行 –

回答

1
SET @row_num := 0; 
UPDATE `table` SET index = @row_num := @row_num + 1 ORDER BY otherId; 
+0

SET @row_num:= 0; UPDATE'table' SET index = @row_num:= @row_num + 1 ORDER BY index;工作:)謝謝。 –

1

不同的方法 - 而不是更新它,做一個新的字段是自動增量,然後改變表,並刪除當前索引字段,並更改新列不自動增量並重新命名回索引?新字段的另一個選項是運行一個簡單的更新(更新表集索引=新字段),然後刪除新字段。

+0

不幸的是,這將需要太多的代碼更改(甚至不要詢問使用該代碼的代碼桌子......它是一場噩夢)並且會掉到範圍之外。讓我更新「糟糕的設計表」到「設計糟糕的表和代碼」lol –

+0

@ bia.migueis如果最終得到一個與舊字段名稱相同的自動增量字段,那麼需要更改哪些代碼? –

+0

當某些東西被添加到表中時,該行的索引設置爲1,而其他行的索引增加1(每次有人重新排列單個產品時,都會有數千條更新語句)。如果我正在做這一切我會用自動增量和排序降序,所以我wouldnt需要所有這些愚蠢的更新,但我沒有權限重做這一切:( –