позиция в каталоге

iceman

говнокодер
позиция в каталоге

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

name | position
каталог1 | 4
каталог2 | 3
каталог3 | 2
каталог4 | 1

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

каталог1 | 4
каталог2 | 3
каталог4 | 1

ну сбросил (выбрав позицию удаляемого каталога, отнимая во всей таблице по 1, где позиция больше, чем у удаляемого каталога):

каталог1 | 3
каталог2 | 2
каталог4 | 1

PHP:
UPDATE catalog SET position=position-1 WHERE position <> 1 and position > 2
все работало нормально, но после ввода фичи для удаления нескольких каталогов моя формула естественно не подходит...

например позиции такие:
7
6
5
4
3
2
1

удаляем 6, 4 , 3

как теперь сбросить позиции? чтобы небыло такого:
7
5
2
1
а чтобы было
4
3
2
1

????
 

Bitterman

Новичок
position <> 1 and position > 2
в чем потаенный смысл этого условия?
И что такого страшного, если каталоги будут пронумерованы не сплошняком, а с разрывами?
удаляем 6, 4 , 3

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

iceman

говнокодер
Автор оригинала: Bitterman
в чем потаенный смысл этого условия?
потомучто ненада уменьшать "вес" каталогов лежащих ниже удаляемого...

position>2 => 2 в этом случае поцзиция удаляемого каталога...

И что такого страшного, если каталоги будут пронумерованы не сплошняком, а с разрывами?
а как по твоему потом сделать котолог еще выше?

если будет так,
7
5
2

2 делаем выше, т.е. прибавляем 1, в итоге 3, и он не будет выше 5, хотя цель была в этом...

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

если ты знаешь другое решение, то подскажи, пожалуйста...
 

Армян

Новичок
position <> 1 and position > 2
если значение position всегда >= 1 то достаточно только position > 2

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

Bitterman

Новичок
а как по твоему потом сделать котолог еще выше?

если будет так,
7
5
2

2 делаем выше, т.е. прибавляем 1, в итоге 3, и он не будет выше 5, хотя цель была в этом...
Ну а если тупо поменять местами 2 и 5?

ты предлагаешь засунуть код обновления таблиц в цикл?

если ты знаешь другое решение, то подскажи, пожалуйста...
Где-то видел еще запрос, который нумерует строки по порядку, с использованием переменной. Попробуй поискать.
Но, на мой взгляд, ты страдаешь фигней.
 

iceman

говнокодер
-~{}~ 05.09.08 07:23:

Автор оригинала: Армян
если значение position всегда >= 1 то достаточно только position > 2
ну да, чето перемудрил...

-~{}~ 05.09.08 07:27:

Bitterman
а все догнал...
 

Kib

Новичок
Автор оригинала: Bitterman
Где-то видел еще запрос, который нумерует строки по порядку, с использованием переменной. Попробуй поискать.
Тоже где-то встречал, посмотри темы за тот месяц, смысл был там в том чтоб после каждого удаления делать перещет
Вот что то типа такого
5
4
3
2
1

если удалили 3, то начиная с 4 уменьшаем позицию на 1

4
3
2
1
 

iceman

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

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

Kib

Новичок
Автор оригинала: iceman
Kib
я же написал, что одновременно можно удалить хоть сколько...

как на форумах слева стоят чек боксы, выбираем нужные, и жмем удалить...
Я есче и невнимателен, написал то что у тебя уже и было.:(
 

iceman

говнокодер
где position > 2 отсортировать, добавить порядковый номер, и обновить используя уже порядковый номер прибавляя 2...
 

zerkms

TDD infected
Команда форума
Тоже где-то встречал, посмотри темы за тот месяц, смысл был там в том чтоб после каждого удаления делать перещет
SET @I := 0;

SELECT *, @I := @I + 1 ...
 

Активист

Активист
Команда форума
Неправильно ты как-то делаешь.

Автор оригинала: iceman
потомучто ненада уменьшать "вес" каталогов лежащих ниже удаляемого...

position>2 => 2 в этом случае поцзиция удаляемого каталога...


а как по твоему потом сделать котолог еще выше?

если будет так,
7
5
2

2 делаем выше, т.е. прибавляем 1, в итоге 3, и он не будет выше 5, хотя цель была в этом...


ты предлагаешь засунуть код обновления таблиц в цикл?

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

У меня есть реализация:
при добавлении нового товара (группы) в каталог ставишь ему position = 0, после всех действий, ставишь `position` = `id` у товаров, где position = 0, соотвественно position у тебя всегда будет уникален. Далее, при поднятии в верх, напиример, производишь замену position'oв у верхнего товара, и двигаемого. Eще раз поднимаешь, соотвественно опять же меняешь'ся значениями position'а у товара выше с текущем. Движение вниз обратно противоположно.

Ни нужно никуда ничего прибавлять или удалать, значения `position` нужно менять между товарами (элементами таблицы).

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

Посмотри мою реализацию твоей задачи, думаю она правильная (меня еще кто-нибудь поддержит???)

http://phpclub.ru/paste/2140
 

Армян

Новичок
Активист
Поддерживаю! Думаю самая верная реализация сортировки :)
 
Сверху