О том, что программисты решают проблемы созданные другими программистами

Silentland

Новичок
Ох... придется засесть с книжками, чувствую) Хотя есть подозрения, что по теме там мало чего. Ведь основная проблема не в алгоритме. Алгоритм сохранения порядка элементов и самому не сложно вычислить. Тут дело в том, какую часть перекладывать на клиент, какую на сервер, а какую и вовсе на сервер БД. Именно таких исследований сейчас крайне мало.
 

hell0w0rd

Продвинутый новичок
Оу, посыпаю голову пеплом, понял о какой сортировке речь...
Так на вывод SORT BY и все?
 

AmdY

Пью пиво
Команда форума
Silentland
я привёл тебе ссылку на решение из доктрины. вот такие готовые кейсы одна из причин юзать эту муть. если интересны алгоритмы, то лучше найти решение и статью в их блоге по первой доктрине. там было всё легко и прозрачно.
 

Silentland

Новичок
Оу, посыпаю голову пеплом, понял о какой сортировке речь...
Так на вывод SORT BY и все?
На вывод да, а на ввод? :)

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

Судя по всему, готовые кейсы можно найти только в составе фреймворков и еще выдирать их оттуда... Тяжела работа программиста :)
 

hell0w0rd

Продвинутый новичок
На вывод да, а на ввод? :)


Может быть плохо разобрался, но там они делают запрос на обновление в цикле по каждому элементу, что как-то... неправильно. Уверен, и в первой так же.

Судя по всему, готовые кейсы можно найти только в составе фреймворков и еще выдирать их оттуда... Тяжела работа программиста :)
Что значит на ввод? На ввод прийдется раздвинуть два элемента. Вам знакомо понятие связного списка? <- вот кстати поэтому хорошо начинать php с компилируемого языка :)
В той же доктрине есть связь OneToOne [self], то есть указатель на самого себя, вам думаю это и нужно.
И на второй вопрос - да, плохо разобрались. Если доктрина где-то делает запросы в цикле - она не делает n запросов. Она n раз подставляет данные в запрос. Почитайте про PDO.
Чтобы избежать запросов в цикле на счет сортировки - юзайте то что я вам подсказал.
 

WMix

герр M:)ller
Партнер клуба
на ввод нужно расставить цифорки в дополнительное поле для того чтоб по ним можно было order by делать, как писать эти цифорки зависит от задачи, можно сделать смену 2х элементов местами, можно какойнить sortable от jQuery прикрутить, тут нужно задачу понимать что сортируем вообще?
 

hell0w0rd

Продвинутый новичок
Вот кстати сама реализация
PHP:
id  next  text
-----------------------
1	2	home
2	3	forum
3	4	contacts
Теперь хотим добавить "about" после "home". Запросто!
1) Посмотрим на что указывает home, - это будет next у about
2) Добавим about и получим его id
3) Изменим next у home
PHP:
id  next  text
-----------------------
1	4	home
2	3	forum
3	4	contacts
4    2    about
 

WMix

герр M:)ller
Партнер клуба
а про флоаты слыхал?
Код:
id  order  text
-----------------------
не суть    2    home
не суть    3    forum
не суть    4    contacts

между home и forum = (3+2)/2
 

WMix

герр M:)ller
Партнер клуба
Код:
order by `order`
флоат очень глубокий, но хочешь после обработки включи нормализацию....
 

WMix

герр M:)ller
Партнер клуба
ничего не даст, можно использовать всю длину между 1 и 2 те 10 значений (те не половина) или с такимже успехом как текст сортировать
между a и b лежит aaa, aacd итд... но все это сложно, можно подобие nested sets алгоритма update order+1 where order > 2 это тоже просто, только что много строк затрагивается но тоже на спичках экономия
 

hell0w0rd

Продвинутый новичок
ничего не даст, можно использовать всю длину между 1 и 2 те 10 значений (те не половина) или с такимже успехом как текст сортировать
между a и b лежит aaa, aacd итд... но все это сложно, можно подобие nested sets алгоритма update order+1 where order > 2 это тоже просто, только что много строк затрагивается но тоже на спичках экономия
Не помню какая cms-ка на хабре рекламировалась. Там когда что-то с базой делаешь из админки - приходит отчет о кол-ве запросов. Как раз отсортируешь менюху - сообщенька "сортировка успешно сохранена. Запросов к базе: 32"
 

hell0w0rd

Продвинутый новичок
Ну, я уже отказался от этой идеи, то что предложил WMix - лучше.
А если говорит о связных списках - ну вот собственно в php вам они не нужны. Они где-то в ядре используются но можно даже об этом не задумываться.
 

Absinthe

жожо
GusakovNick а что, в компилируемых языках (Java, C# и т.д.) нужно о них задумываться?
 

Silentland

Новичок
На ввод, т.е. задача сохранять элементы в новом порядке, а не выводить. Не помню, писал или нет, но повторюсь. Сейчас у меня так:
PHP:
public function savesort($posArr) {
    
        $possTmp = array();

        foreach ($posArr as $k => $v) {
            $possTmp[] = "(" . (int)$v . "," . (int)$k . ")";
        }
        mysql_query("insert into `" . $this->tableName . "` (`id`, `pos`)        values " . implode(", ", $possTmp) . " on duplicate key update `pos` = values(`pos`)");

        return true;
	}
Соответственно, jQuery посылает серверу перечень айдишников в нужном порядке. Способ не плох, но нужно постоянно следить, чтобы в списке не было удаленных айдишников, иначе элементы создадутся вновь

Второй способ, это связанный список. Тогда jQuery будет посылать только айди старого соседа перемещаемого элемента и айди нового соседа. Правда эти айди еще нужно вычислить, но это уже проблема клиента. Сохранение на сервере в этом случае подразумевает вычисление столбца order, как WMix писал.

А задача сортировки подразумевает как изменение порядка одного элемента, так и группы (задача максимум).
 
Сверху