Как можно риализовать передвижение эллементов в таблице, относительно друг-друга поделитесь пожалуйста хорошими алгоритмами=) У меня есть вот такой, но наверняка есть лучше и проще: Нужна таблица с двумя столбцами id и pos. Каждый элемент имеет уникальный ИД. А ПОС означает за каким эллементом он следует(а у первого "0"). То есть: 01|0 02|01 03|02 04|03 05|04 Передвижение вниз в три шага: 1) Код (Text): 01|0 01|0 02|01 1 02|01 03|02 ==> 03|01 <-- 04|03 04|03 05|04 05|04 2) Код (Text): 01|0 01|0 02|01 2 02|03 <-- 03|01 ==> 03|01 04|03 04|03 05|04 05|04 3) Код (Text): 01|0 01|0 02|03 3 02|03 03|01 ==> 03|01 04|03 04|02 <-- 05|04 05|04 Готово=)
Ах, да..... всё это затеяно что бы при удалении/добавлении нового элемента не приходилось обновлять всю таблицу, а только три элемента. Если бы pos был просто порядковым номером, то например при добавлении в середину пришлось бы обновлять все записи pos у последуйщих элементов: Код (Text): 1|1 1|1 2|2 6|2 <-- add 3|3 ==> 2|2 + 1 4|4 3|3 + 1 5|5 4|4 + 1 5|5 + 1
Ой, нет.... конечно не так.... рекурсивно надо выводить сначало меньшее, а потом та же функция выводит следуйшее. То есть не по порядку конечно же. Но это довольно сложно и много затрат получаеться.
Удалять DELETE FROM table WHERE ...... Не важно, что в поле pos значения будут идти не подряд, порядок от этого не изменится. Чтобы вставить запись, нужно определить pos ряда, после какого будет вставлено значение. Всем значениям, которые больше найденого pos добавляем единицу. Если запись вставляется в конец таблицы, то pos присваивается значение, возращаемое функцией MySQL LAST_INSERT_ID() или функцией PHP mysql_insert_id()
Mavir спасибо Это и в правду другой вариант. Только в нем приходиться при добавлении делать UPDATE всей таблице после места, куда вставляешь, хотя зато при удалении вобще ничего изменять не надо, менять местами можно за 2 UPDATE, а не 3, и вывод куда проще - просто по порядку. В "моем"(конечно я его просто нашел) варианте любое действие затрагивет только 3 записи, но приходиться выводить рекурсивно(надо каждый раз смотреть кого следуйщим выводить, и выводить ли вобще). Может быть у кого-нибудь есть ссылки на похожии задачи?
Надеюсь не будешь обновлять каждую запись по отдельности Надо так Код (Text): UPDATE table SET pos=pos+1 WHERE pos>$n
Может быть у кого-нибудь есть ссылки на похожии задачи?[/quote] Если задача состоит в том, чтобы сменить порядок вывода строк, как, например, вот тут http://sun-health.ru. Кверху подтягивается тот блок, меню которого было выбрано. PHP: function sort ($id_block) { $result=mysql_query("select * from block where id=$id_block"); $row=mysql_fetch_array($result); mysql_query("update block set pn=".$row['pn']." where pn=1"); mysql_query("update block set pn=1 where id=$id_block"); )