Изменение порядка строк в таблице MySQL

#mysql #sql

#mysql #sql

Вопрос:

У меня есть таблица:

  -------- ------------------- ----------- 
| ID     | Name              |  Order    |
 -------- ------------------- ----------- 
| 1      | John              | 1         |
| 2      | Mike              | 3         |
| 3      | Daniel            | 4         |
| 4      | Lisa              | 2         |
| 5      | Joe               | 5         |
 -------- ------------------- ----------- 
  

Порядок может быть изменен администратором, отсюда и столбец порядка. На стороне администратора у меня есть форма с полем выбора Insert After: для записей в базе данных. Какой запрос я должен использовать, чтобы упорядочить 1 после вставленного столбца.

Я хочу сделать это таким образом, чтобы нагрузка на сервер была минимальной, потому что в настоящее время в этой таблице 1200 строк. Это правильный способ сохранить порядок в таблице или есть лучший способ?

Любая помощь приветствуется

Редактировать:

Вот что я хочу сделать, благодаря itsmatt:

хотите изменить порядок строк с номером 1 после строки 1100, вы планируете оставить 2-1100 одинаковыми, а затем изменить 1 на 1101 и увеличить 1101-1200

Комментарии:

1. Итак, если вы хотите изменить порядок строк с номером 1 после строки 1100, вы планируете оставить 2-1100 одинаковыми, а затем изменить 1 на 1101 и увеличить 1101-1200? Просто пытаюсь понять, чего вы здесь хотите.

2. Разумно ли изменять номер заказа? Я бы подумал, что это может привести к путанице.

Ответ №1:

Вам нужно сделать это в два этапа:

 UPDATE MyTable 
   SET `Order` = `Order`   1 
 WHERE `Order` > (SELECT `Order` 
                    FROM MyTable 
                   WHERE ID = <insert-after-id>);
  

… который переместит порядковый номер каждой строки дальше по списку, чем человек, которого вы вставляете после.

Затем:

 INSERT INTO MyTable (Name, `Order`)
VALUES (Name, (SELECT `Order`   1 FROM MyTable WHERE ID = <insert-after-id>));
  

Чтобы вставить новую строку (при условии, что идентификатор автоматически увеличивается), с порядковым номером на единицу больше, чем у человека, которого вы вставляете после.

Комментарии:

1. получение этой ошибки You can't specify target table 'test_cat' for update in FROM clause

2.@LeePrice, вам нужно окружить подвыборку в другой подвыборке следующим образом: ... where order > (select * from (select order from mytable where id = ...)) (Способы MySQL странные)

3. теперь я получаю это: Every derived table must have its own alias :/

Ответ №2:

Просто добавьте новую строку любым обычным способом и позвольте более позднему ВЫБОРУ использовать ORDER BY для сортировки. 1200 строк бесконечно мало по стандартам MySQL. Вам действительно не нужно (и не нужно) сортировать физическую таблицу. Вместо этого используйте ключи и индексы для доступа к таблице таким образом, чтобы получить то, что вы хотите.

Ответ №3:

вы можете

 insert into tablename (name, `order`) 
values( 'name', select `order` 1 from tablename where name='name')
  

вы также можете использовать id=id_val в своем внутреннем выборе.

Надеюсь, это то, что вам нужно, вопрос не совсем ясен.

Комментарии:

1. это не будет работать, как указано, потому order что это зарезервированное ключевое слово в SQL. Вам нужно обернуть его в обратные метки, чтобы MySQL видел его как имя поля, а не ключевое слово.

2. как насчет использования max(order) 1

3. @diEcho: это будет работать в системе с одним подключением, но вы столкнетесь с проблемами параллелизма при параллельном выполнении этого запроса.

4. -1 Этот запрос не будет работать, A: select выберет несколько строк, отключив оператор insert B: limit 1 не поможет, потому что это просто выберет неопределенную строку C: order by 'order' DESC limit 1 будет работать большую часть времени, но столкнется с проблемами параллелизма, если вы запустите запрос параллельно.