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

Тема в разделе "Как сделать...", создана пользователем chang, 11 апр 2011.

  1. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    в БД есть запись

    PHP:
    id,  name,   index
    1     qwe      1
    2     qwe2     3
    3     qwe4     2
    выводятся посты соответственно сортируемые по полю index


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

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

    как Вы такое делаете?
     
  2. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    199
    Симпатии:
    55
    Пусть порядок у записи с $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; //меняем позицию для текущей
    
    Порядок запросов не менять.
     
    chang нравится это.
  3. horpah

    horpah

    Регистр.:
    21 июн 2010
    Сообщения:
    199
    Симпатии:
    55
    Да, кстати, что-то я немного ступил в предыдущем посте.
    Если $p2>$p1 то запись идет вниз и следовательно в запросе `index`=`index`-1 (минус, т.е. промежуточные идут вверх).
    А если $p2<$p1? то запись идет вверх и тогда промежуточные идут вниз `index`=`index`+1 (плюс). :)
     
  4. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    ну это мелочь уже .. главное идея

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

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

    еще при удалении нужно нужно контролировать целостность этих индексов ... как-то не очень хорошо выходи
     
  5. horpah

    horpah

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

    saen

    Регистр.:
    6 авг 2006
    Сообщения:
    756
    Симпатии:
    129
    А что тебе мешает поставить индекс на поле?