Поменять местами значения полей

n0nam3

Guest
Поменять местами значения полей

Например, есть строка с id=15 и строка с id=17. Нужно, чтоб у первой строки id стало 17, а у второй — 15. Как это сделать лучше всего?
 

n0nam3

Guest
Фанат, да, конкретно id менять не стоит. А если нужно поменять местами какие-нибудь другие поля?
 

Фанат

oncle terrible
Команда форума
а тебе зачем?
скорее всего ты что-то делаешь неправильно
 

camka

не самка
Я использую такой запрос для подмены значений высоты и ширины картирки при повороте её на 90 градусов

update image set width=(@u:=width)*0+height, height=@u where id=<ID>;
 

camka

не самка
а. надо у одного и того же поля двух разных строк поменять значения. Сейчас сообразим

-~{}~ 22.04.05 00:49:

update tab a1, tab a2 set a1.value = (@u:=a1.field)*0+a2.field, a2.value = @u where a1.id=<VALUE> and a2.id=<VALUE>;

Это для числовых полей. Для текстовых можно помудрить с CONCAT'ом.
 

Фанат

oncle terrible
Команда форума
осталось только решить - зачем все эти страдания.
 

camka

не самка
Во!

update tab a1, tab a2 set a1.field = concat(repeat((@u:=a1.field),0), a2.field), a2.field = @u where a1.id=<VALUE1> and a2.id=<VALUE2>;

-~{}~ 22.04.05 01:00:

А страдания могут быть, скажем, чтобы поменять местами порядковые номера двух произвольно взятых строк в неком гипотетическом списке.
 

Screjet

Новичок
camka
Для этого нужно завести поле "порядковый номер" и не заморачиваться.
Или, уж если очень хочется извращений, то вначале вытащить обе записи, удалить, а потом вставить с разными id.
 

camka

не самка
Автор оригинала: Screjet
camka
Для этого нужно завести поле "порядковый номер" и не заморачиваться.
Или, уж если очень хочется извращений, то вначале вытащить обе записи, удалить, а потом вставить с разными id.
Дак я про поле порядкового номера и говорю. И в примере, как можно заметить, я не значения поля с первичным ключем меняю, а совершенно другое, которое, собственно, и может являтся хоть порядковым номером, хоть чем угодно.

-~{}~ 22.04.05 11:15:

Да и атомарность какая-никакая приобретается, когда делаешь одним запросом.
 

n0nam3

Guest
Прокомментирую, зачем оно мне. Есть таблица, в ней хранится иерархическое меню. Нужно сделать перемещение пунктов меню вверх и вниз.

Как оно отображается: 2 цикла, выборка узла, потом выборка всех пунктов к этому узлу принадлежащих. Пункты сортируются по id.

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

crocodile2u

http://vbolshov.org.ru
Не надо для этого менять ID. Заведи поле, в котором будет храниться порядковый номер узла в своем уровне своей ветки. И меняй его.
 

fixxxer

К.О.
Партнер клуба
лучше все перестановки делать на js, а самбитить уже нужную последовательность целиком.
пожалей сервер =)
 

crocodile2u

http://vbolshov.org.ru
fixxxer
Ну, это еще нужно посмотреть, насколько часто ожидаются подобные перемещения.
 

n0nam3

Guest
crocodile2u
Достаточно редко. Практически их не будет вообще, а эта фишка введена для галочки.
 
Сверху