За последние 24 часа нас посетили 17079 программистов и 1298 роботов. Сейчас ищут 1446 программистов ...

Передвижение записей вверх/вниз

Тема в разделе "PHP и базы данных", создана пользователем pink monster, 2 сен 2006.

  1. pink monster

    pink monster Активный пользователь

    С нами с:
    5 июн 2006
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    Rastatt
    Как можно риализовать передвижение эллементов в таблице, относительно друг-друга
    поделитесь пожалуйста хорошими алгоритмами=) У меня есть вот такой, но наверняка есть лучше и проще:



    Нужна таблица с двумя столбцами id и pos. Каждый элемент имеет уникальный ИД. А ПОС означает за каким эллементом он следует(а у первого "0"). То есть:
    01|0
    02|01
    03|02
    04|03
    05|04

    Передвижение вниз в три шага:
    1)
    Код (Text):
    1. 01|0         01|0
    2. 02|01   1    02|01
    3. 03|02   ==>  03|01  <--
    4. 04|03        04|03
    5. 05|04        05|04
    2)
    Код (Text):
    1. 01|0         01|0
    2. 02|01   2    02|03  <--
    3. 03|01   ==>  03|01
    4. 04|03        04|03
    5. 05|04        05|04
    3)
    Код (Text):
    1. 01|0         01|0
    2. 02|03   3    02|03
    3. 03|01   ==>  03|01
    4. 04|03        04|02  <--
    5. 05|04        05|04
    Готово=)
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    почему POS элемет, за которым следует, а не позиция?

    1|1
    2|2
    3|3
    4|4
    5|5

    1|1
    5|2
    3|3
    4|4
    2|5
     
  3. pink monster

    pink monster Активный пользователь

    С нами с:
    5 июн 2006
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    Rastatt
    Ах, да..... всё это затеяно что бы при удалении/добавлении нового элемента не приходилось обновлять всю таблицу, а только три элемента. Если бы pos был просто порядковым номером, то например при добавлении в середину пришлось бы обновлять все записи pos у последуйщих элементов:
    Код (Text):
    1. 1|1      1|1
    2. 2|2      6|2 <-- add
    3. 3|3  ==> 2|2 + 1
    4. 4|4      3|3 + 1
    5. 5|5      4|4 + 1
    6.          5|5 + 1
     
  4. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    а выборку в таком случае как строить?
     
  5. pink monster

    pink monster Активный пользователь

    С нами с:
    5 июн 2006
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    Rastatt
    По полю pos от меньшего к большему соответственно
     
  6. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    поле ППП?

    SELECT
     
  7. pink monster

    pink monster Активный пользователь

    С нами с:
    5 июн 2006
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    Rastatt
    Ой, нет.... конечно не так.... рекурсивно надо выводить сначало меньшее, а потом та же функция выводит следуйшее. То есть не по порядку конечно же. Но это довольно сложно и много затрат получаеться.
     
  8. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    ну и смысл тогда оптимизации?
     
  9. pink monster

    pink monster Активный пользователь

    С нами с:
    5 июн 2006
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    Rastatt
    Я просто ничего лучше найти не могу=(
     
  10. Mavir

    Mavir Guest

    Вот лучшее
     
  11. pink monster

    pink monster Активный пользователь

    С нами с:
    5 июн 2006
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    Rastatt
    Я тогда не понимаю как можно будет удолять и вставлять эллементы=(
     
  12. Mavir

    Mavir Guest

    Удалять DELETE FROM table WHERE ......
    Не важно, что в поле pos значения будут идти не подряд, порядок от этого не изменится.

    Чтобы вставить запись, нужно определить pos ряда, после какого будет вставлено значение. Всем значениям, которые больше найденого pos добавляем единицу.
    Если запись вставляется в конец таблицы, то pos присваивается значение, возращаемое функцией MySQL LAST_INSERT_ID() или функцией PHP mysql_insert_id()
     
  13. pink monster

    pink monster Активный пользователь

    С нами с:
    5 июн 2006
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    Rastatt
    Mavir
    спасибо :D
    Это и в правду другой вариант. Только в нем приходиться при добавлении делать UPDATE всей таблице после места, куда вставляешь, хотя зато при удалении вобще ничего изменять не надо, менять местами можно за 2 UPDATE, а не 3, и вывод куда проще - просто по порядку.
    В "моем"(конечно я его просто нашел) варианте любое действие затрагивет только 3 записи, но приходиться выводить рекурсивно(надо каждый раз смотреть кого следуйщим выводить, и выводить ли вобще).
    Может быть у кого-нибудь есть ссылки на похожии задачи?
     
  14. Mavir

    Mavir Guest

    Надеюсь не будешь обновлять каждую запись по отдельности :)
    Надо так
    Код (Text):
    1. UPDATE table SET pos=pos+1 WHERE pos>$n
     
  15. Ed

    Ed Активный пользователь

    С нами с:
    7 сен 2006
    Сообщения:
    2
    Симпатии:
    0
    Может быть у кого-нибудь есть ссылки на похожии задачи?[/quote]

    Если задача состоит в том, чтобы сменить порядок вывода строк, как, например, вот тут http://sun-health.ru. Кверху подтягивается тот блок, меню которого было выбрано.
    PHP:
    1. function sort ($id_block) {
    2. $result=mysql_query("select * from block where id=$id_block");
    3. $row=mysql_fetch_array($result);
    4. mysql_query("update block set pn=".$row['pn']." where pn=1");
    5. mysql_query("update block set pn=1 where id=$id_block");
    6. )