изменение последовательности вывода постов

chang

Постоялец
Регистрация
20 Ноя 2009
Сообщения
363
Реакции
118
в БД есть запись

PHP:
id,  name,   index
1     qwe      1
2     qwe2     3
3     qwe4     2

выводятся посты соответственно сортируемые по полю index


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

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

как Вы такое делаете?
 
Пусть порядок у записи с $id меняется с позиции $p1 на позицию $p2. Тогда все расположенные позиции между $p1 и $p2 поднимутся на 1 позицию вверх. Следовательно запросы будут такие:
Код:
UPDATE `table` SET `index`=`index`+1 WHERE `index` BETWEEN $p1+1 AND $p2; //меняем порядок для промежуточных записей
UPDATE `table` SET index=$p2 WHERE id=$id; //меняем позицию для текущей
Порядок запросов не менять.
 
Да, кстати, что-то я немного ступил в предыдущем посте.
Если $p2>$p1 то запись идет вниз и следовательно в запросе `index`=`index`-1 (минус, т.е. промежуточные идут вверх).
А если $p2<$p1? то запись идет вверх и тогда промежуточные идут вниз `index`=`index`+1 (плюс). :)
 
ну это мелочь уже .. главное идея

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

хотелось бы как-то отойти от этого

еще при удалении нужно нужно контролировать целостность этих индексов ... как-то не очень хорошо выходи
 
А что это у вас за такая таблица, где индивидуальный порядок важен для большого количества записей? Обычно такие вещи делаются для небольшого числа записей.
Например категории (пара десятков от силы). МБ еще список форумов или глобальных тем, как меню на нулледе.... Но в какой задаче индивидуаьный порядок может быть важен для огромного числа записей? 100 и даже 10000 - это не много для апдейта, только даже для 100 записей у меня не хватает фантазии придумать такую задачу. :)
 
Назад
Сверху