如果我有以下表&數據允許我們使用sort_index
排序:MySQL的更新排序索引列到移動項目
CREATE TABLE `foo` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`bar_id` INT(11) DEFAULT NULL,
`sort_index` INT(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `foo` (`bar_id`, `sort_index`) VALUES
(1,1),(1,2),(1,3),(1,4),
(2,1),(2,2),(2,3),(2,4),(2,5);
我希望能夠做到以下幾點以最有效方式:
- 移動FOO條目到給定位置(由bar_id作用域)
- 確保
sort_index
始終爲1索引,有沒有間隙 - 您應該能夠將項目移至開始和列表和規則#2仍應適用結束
- 應在查詢全部完成,儘可能少的可能(因爲臺可能是非常大的循環在他們做個別
UPDATE
s的不理想)
- 確保
爲了澄清什麼,我試圖做的,讓我們假設該表是空的,所以我們有以下數據:
id | bar_id | sort_index
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
4 | 1 | 4
5 | 2 | 1
6 | 2 | 2
7 | 2 | 3
8 | 2 | 4
9 | 2 | 5
然後如果我們做以下動作
- 富1至sort_index 3
- FOO 7 sort_index 1個
- 富5 sort_index 5
我們應得的以下數據:
id | bar_id | sort_index
1 | 1 | 3
2 | 1 | 1
3 | 1 | 2
4 | 1 | 4
5 | 2 | 5
6 | 2 | 2
7 | 2 | 1
8 | 2 | 3
9 | 2 | 4
SELECT * FROM foo ORDER BY bar_id, sort_index;
給我們:
id | bar_id | sort_index
2 | 1 | 1
3 | 1 | 2
1 | 1 | 3
4 | 1 | 4
7 | 2 | 1
6 | 2 | 2
8 | 2 | 3
9 | 2 | 4
5 | 2 | 5
爲了澄清你的問題:給定上面的插入,你希望在開始時插入另一個'bar_id' = 1的行,導致所有後續行的更新(列'sort_index') 'bar_id'是1的位置? – tangens 2009-10-17 08:56:55
總結您的要求,對於任何一組「bar_id」,sort_index必須從零開始,並加1,直到最大的sort_index數字。你想完全在MySQL中執行任何移動/添加/刪除操作? – 2009-10-17 08:58:40