#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
будет работать большую часть времени, но столкнется с проблемами параллелизма, если вы запустите запрос параллельно.