2015-07-21 9 views
0

Я пытался найти решение для этого и нашел несколько похожих сообщений, но никто из них не ответил на мой вопрос.update from select incremental mysql

У меня плохо спроектированная таблица, в которой хранится индекс сортировки. Программно мы обновляем этот индекс, когда люди сортируют некоторые данные. Проблема в том, что теперь индексы выглядят примерно как 1, 2, 2, 3, 6, 6, 7, 8, 8, etc, поэтому мне поручено решить эту проблему. Я исправил код, так что этого больше не происходит, но как обновить db? У меня есть таблица:

+---------+-------+---------+ 
| 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

lol Я сказал плохо спроектированный стол. нет инкрементирующего 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

Как насчет другого подхода - вместо того, чтобы его обновлять, создайте новое поле, которое автоматически увеличивается, а затем меняет таблицу и отбрасывает текущее поле индекса и меняет новый столбец, чтобы не было автоматического увеличения и переименования индексировать? Другой вариант с этим новым полем - это простое обновление (update table set index = newfield), а затем падение нового поля.

+0

, к сожалению, для этого потребуется слишком много изменений кода (даже не спрашивайте о коде, который использует этот стол ... его кошмар) и выпадет из сферы действия. позвольте мне обновить «плохо спроектированную таблицу» до «плохо спроектированной таблицы и кода» lol –

+0

@ bia.migueis Если вы закончите с полем автоинкремента с тем же именем, что и у старого поля, то какой код нужно изменить? –

+0

, когда что-то добавляется в таблицу, индекс этой строки устанавливается в 1, а в других строках индекс увеличивается на 1 (да, тысячи операторов обновления каждый раз, когда кто-то переупорядочивает один продукт). если бы я делал все это, я бы использовал автоинкремент и сортировку по убыванию, поэтому мне не нужны все эти глупые обновления, но у меня нет разрешения на повторную установку :( –