Есть таблица в MySQL с полями id(int,autoincrement), [много не относящихся к вопросу полей], pos(int).
Столбец pos всегда целое число по порядку 1,2,3.... По нему делается ORDER by pos и записи выводятся в нужном порядке. Необходимо реализовать настраиваемый порядок вывода записей.
Посоветуйте, пожалуйста, как реализовать 3 вещи:
$db->create($pos_m)$db->move($id, $pos_n, $pos_m)id db->remove($id)При этих действиях нужно, чтобы pos у всех остальных записей пересчитывался по порядку заново, чтобы не было разрывов. Если запись помещается в середину, все, что больше сдвигались на +1 и т.д. Pos всегда должен отражать реальный номер по порядку, а не как предложили делать тут.
Записей таких не будет много, и такие действия не будут происходить часто, поэтому здесь не нужна производительность.
Если есть возможность реализовать это на чистом SQL, здорово, но можно переложить часть работы на PHP и сделать несколько запросов.
Вставка
INSERT INTO mytable (pos) VALUES (:pos);
UPDATE mytable SET
pos = pos + 1
WHERE
pos => :pos AND
id <> LAST_INSERT_ID();
Перенос
UPDATE mytable SET
pos = pos + IF(:old_pos < :new_pos, -1, 1)
WHERE
pos BETWEEN :old_pos + 1 AND :new_pos OR
pos BETWEEN :new_pos AND :old_pos - 1
UPDATE mytable SET
pos = :new_pos
WHERE
id = :id;
Необходимость пересчитывать pos при удалении для меня под вопросом. Разрывы на сортировку не влияют. Но если нужно, то делается так
UPDATE mytable SET
pos = pos - 1
WHERE
pos > (SELECT pos FROM mytable WHERE id = :id);
DELETE FROM mytable WHERE id = :id;
Все мои манипуляции подразумевают, что для поля pos не создан уникальный ключ
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости