Помогите с запросами

Статус
В этой теме нельзя размещать новые ответы.

morro

Новичок
Помогите с запросами.
Есть таблица


Собственно что нужно:

Обновление таблиц по позиции
( pos 5 на pos 2
pos 2,3,4 смещаются соответственно на позицию вниз)

и обратный порядок, обновление таблиц по позиции
( pos 2 на pos 5
pos 5,4,3 смещаются соответственно на позицию вверх)
 

zerkms

TDD infected
Команда форума
просто примитивный update, есть конкретные вопросы?
 

zerkms

TDD infected
Команда форума
Вы не правы, - здесь не всё так просто, как кажется. Это цикличиский сдвиг вперёд/назад.
Стандартного решения в SQL нет. Возможно решение минимум в три простых запроса UPDATE.
Сдвиг, обожемой, не может быть.

Это не проблема, и не "нестандартность". Это рутина.

Три примитивных запроса (причём все эти три апдейта можно в 1 превратить).

И потом ты в соседнем топике рассуждаешь о плохих работодателях/плохих собеседованиях?
 

zerkms

TDD infected
Команда форума
Chushkin

IF, CASE

ps: апдейтов там два, а не три (все сдвигаем на 1, последний двигаем на первую позицию)

Для Вас может и рутина, для новичка не всё просто.
Даже новичка не нужно пугать такими простыми вещами. Написать запрос на 3 страницы - одно дело, сложно и устанешь, а написать UPDATE с изменением одного столбца и WHERE с 1 условием сравнения - просто для всех.
 

morro

Новичок
Как вы можете не согласиться, если вам лень решать свою проблему и вы ждёте готового решения?

Вот что вы уже для решения этого вопроса сделали сами?
Не лень - мало опыта но много желания.
Причём это только для себя.
Пишу свой сайт и стараюсь понять PHP и MySQL
Пример
[censored]
 

morro

Новичок
Как вы можете не согласиться, если вам лень решать свою проблему и вы ждёте готового решения?

Вот что вы уже для решения этого вопроса сделали сами?
А решение наверное примерно такое
PHP:
UPDATE tbl SET pos = 2 WHERE pos = 5
UPDATE tbl SET pos = pos+1 WHERE pos < 5 AND pos >=2
 

zerkms

TDD infected
Команда форума
Chushkin
Это шутка что ли?

UPDATE pos = IF(id = 5, 2, pos + 1) WHERE id BETWEEN 2 AND 5

upd: вон даже ТС уже написал эти запросы, респект ему. Всё таки правильно тебе в соседнем тредике про пафос оверлоадинг писали :)
 

Redjik

Джедай-мастер
zerkms
я делаю так же как morro всегда - в два запроса, что по производительности лучше будет в записях over 100500
(да, лень explain посмотреть =))))
 

zerkms

TDD infected
Команда форума
zerkms
я делаю так же как morro всегда - в два запроса, что по производительности лучше будет в записях over 100500
(да, лень explain посмотреть =))))
Нет, не будет там разницы :)

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

ps: в следующий раз не ленись и погляди, что план там будет одинаковый
 

Redjik

Джедай-мастер
morro
я кстати первым постом написал, что нужно спросить у гугла (заранее сам проверил результат).
Первая ссылка ответ на вопрос.
Вы не правы, - здесь не всё так просто, как кажется. Это цикличиский сдвиг вперёд/назад.
Стандартного решения в SQL нет. Возможно решение минимум в три простых запроса UPDATE.
Это вообще похоже на саботаж, задача решается элементарно, но вы,сударь, намеренно вводите ТС в заблуждение.
 

zerkms

TDD infected
Команда форума
Нет, не шутка, к сожалению. Как частный случай Ваше решение допустимо. Но в общем случае оно неправильное и работать не будет, например в случае наличия у.ключа по полю pos (а он должен быть!).
Правильным решением будет примерно такое:
UPDATE ttt set pos = pow(2, 31)-1 WHERE pos = 5;
UPDATE ttt set pos = pos + 1 WHERE id BETWEEN 2 AND 4 ORDER BY pos DESC;
UPDATE ttt set pos = 2 WHERE pos = pow(2, 31)-1;
Ну, что ж, [censored] - так [censored]:

1. pow(2, 31)-1 --- нет никакой гарантии, что такого числа в таблице ещё нет.

2. ORDER BY pos DESC; сортировка не нужна, только ухудшит план (тут я неправ)

3. `UPDATE ttt set pos = 2 WHERE pos = pow(2, 31)-1;` - ты забыл сказать о транзакциях, без них твоё решение точно так же недопустимо. Назвался дартаньяном - будь добр предусмотреть всё.

4. Ну и напоследок:
"Но в общем случае оно неправильное и работать не будет, например в случае наличия у.ключа по полю pos" --- ты уверен, что оно не будет работать? Запрос как бы один :) Даю подсказку: констрейнты проверяются после запроса (а не вовремя) Но вместо того, чтобы почитать и (не может быть) подумать тебе интереснее попытаться [censored] :) (тут я неправ)

Вот такое вот оно у тебя, "правильное" решение... Настолько правильное, что, назвавшись решением для "общего" случая, не гарантирует даже работоспособности в поставленных ТОБОЙ ЖЕ условиях, эх.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Тема закрыта.

Проблемы личного характера и бессмысленные споры между участниками не являются предметом обсуждения форума.
Обсуждайте их в привате.
 

zerkms

TDD infected
Команда форума
Нифига себе я туплю... И вправду в середине. Судя по всему это фича мускуля, в оракле оно проверяло после выражения.

Тогда пардон.

ps: `1 пункт - конечно никакой гарантии` -- ну значит ваше решение никуда не годится. На то решение и общее, что оно работает во всех ситуациях

pps: но вообще всё твоё "общее" решение строится на предположении, что позиция должна быть уникальной (непонятно кому, но должна)
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху