Позиция отображения

pitbull

Новичок
Позиция отображения

Есть таблица с разделами (ид,название,описание,видимость....)
Очень хочется сделать возможность перемещения разделов (при отображении) вверх и вниз.
Решил добаить поле pos. Что при перемещении раздела менялись местами только значения этого поля. Но когда удаляешь, потом добавляешь разделы.... начинаются сбои....
Как это реализовать (структуру таблицы и php код перемещения)???
PS/ Поискал, но ниче не нашел, подумал...., но то что получилось стыдно показать.... :( вот.
 

Фанат

oncle terrible
Команда форума
скажи, а почему ты пишешь ответы в темы, которые не читаешь?
 

Фанат

oncle terrible
Команда форума
скажи, а почему ты пишешь ответы в темы, которые не читаешь?
 

Фанат

oncle terrible
Команда форума
вот от этом и речь.
когда ты смысла не понимаешь в своём топике - это можно понять.
а когда ты чужоё вопрос не прочитал, не понял, но лезешь со своими советами - зачем?
 

pitbull

Новичок
эээ... если можно линк плз... я чес слово всегда читаю, что написано. И если знаю, то пишу, а коли не знаю, то просто за ответами слежу.
 

Фанат

oncle terrible
Команда форума
http://phpclub.ru/talk/showthread.php?s=&postid=573185#post573185

-~{}~ 19.02.06 22:12:

http://phpclub.ru/talk/showthread.php?postid=572032#post572032
 

pitbull

Новичок
з.ы. сорри, постараюсь внимательнее вчитываться в посты, написанные до меня. ((с) Loshadka, тамже). Но там правда, бессмыслица поначалу шла, что ниче непонять.... еще раз сорри....
А мой вопрос столь же бессмысленным кажется при прочтении? Мдя пытался кратко отразить смысл.... не получилось.
Перефразирую:
есть таблица, есть вывод таблицы через
SELECT *FROM table WHERE id=$id ORDER BY pos
Вот. А как сделать так, чтобы можно было перемещать элементы вверх или вниз, т.е. изменять значение pos этих эл-тов. Опять ниче не понятно.... ну не могу я это другими словами описать! не могу. sorry (
 

master_x

Pitavale XXI wieku
pitbull
вполне понятно что тебе нужно. есть два варианта. один- прибавление единицы к порядковым номерам всех элементов, которые будут идти после премещаемого элемента. Второй вариант- высчитывание среднего арифм. позиций элементов, между которыми надо вставить перемещаемый элемент.
 

pitbull

Новичок
а поподробнее если можно?
Я вообще думал, что если надо переместить строку, скажем вверх то надо поменять значения pos между перемещаемым и тем, что находится выше. Все работает, но если начать удалять строки, а потом снова вставлять.... начинается непонятное....
Мож у меня не правильный подход?
 

master_x

Pitavale XXI wieku
pitbull
ты пойми одно, что строки не премещаются вверх-вниз, строку можно поставить сразу под другой строкой, тогда все упращается. Есть строка 3, нам надо поставить ее перед строкой 2 (по-твоему переместить вверх), так вот берешь и все строки после строки 1 изменяешь на "pos=pos+1 where pos>1". Аналогично если тебе надо опустить строку, она же все равно встанет после какой-то строки, к примеру после 7 но перед 8, т.е. точно так же "pos=pos+1 where pos>7".
Второй метод. Слушай внимательно. Тебе надо поставить строку 12 после строки 5, перед строкой 6. Новая позиция строки 12 будет 5+6/2 (среднее арифм). Все просто. Но в этом случае нужна нормализация таблицы, т.е. раз в месяц к примеру, надо запускать скрипт, который будет упорядочивать записи в таблице "по-нормальному", т.е. было 1, 2, 3...5, 5.5, 6, 7, 8... стало 1, 2, 3, 4, 5, 6...
 

voituk

прозревший
А теперя по теме:
Когда стояла такая задача на таблице в несколько сот записей с довольно редкими insert-ами, делали так:

Добавляли поле sort? и при добавлении (где надо при изменении ) записи выполнял перенумерацию согласно уже существующего порядка:
[sql]
select @var:=0;
uptate my_table set sort=(@var:=@var+1) order by sort;
[/sql]
Чтоб вновь добавленная запись не становилась первой, при добавлении для неё ставить значение sort побольше. Или же использовать default value в БД.

Теперь каждое перемещение на один по порядку выполняется 2-мя запросами (поменять местами выбранную строку и предыдущую/следующую).

P.S. Не рекомендую такой способ при больших таблицах
 

chira

Новичок
pitbull

твоя идея по моему работоспособна
Очень хочется сделать возможность перемещения разделов (при отображении) вверх и вниз.
Решил добаить поле pos. Что при перемещении раздела менялись местами только значения этого поля.
рассмотрим два поля
id - PRIMARY KEY
pos - поле для сортировки

при вставке новой записи по default pos=id

при смене местами двух записей соответственно
id IN (12,28)
pos IN (35,7)
нужно выполнить один SQL
UPDATE mytable SET pos=IF(id=12,7,35)
WHERE id IN (12,28)

подробней можешь объяснить где проблема:
Но когда удаляешь, потом добавляешь разделы.... начинаются сбои....
 
Сверху