Существует каталог интернет-магазина. Все товары в нем забиты в базу MySQL и у каждого товара есть свой уникальный id (присваивается автоматически). При просмотре каталога товаров, список товаров выводится согласно данному id - т.е. от большего к меньшему. Требуется внести функцию, чтобы администратор сайта через панель управления мог определенный товар ставить на более высокое место или наоборот на более низкое. Можно сделать подобную функцию и чтобы id оставался уникальным, прийдется менять значение id и всех других товаров, но в таком случае получиться большое кол-во запросов к БД. Может кто подскажет более практичный алгоритм присвоения позиции товару? Что-то вроде этого: торт "Винни-пух" у нас был в каталоге под номером 14, а надо его поставить на номер 7, при этом чтобы другие товары не сбились.
Sleven добавляешь поле вес по умолчанию 0 и ручками проствляешь веса. ну сортируешь по весу а не по id
добавь дополнительное поле 0 - сортировка по ид -1000.1000 - как тебе надо ниже или выше опередили. только сортируешь по весу, ид
честно говоря не понял смысла - чем это поле будет отличаться от поля id, кроме того что его сам вручную заполняешь? Допустим вывожу товары по полю "вес", в котором стоит порядковый номер позиции товара, потом захочу сменить его позицию - тогда ведь все равно прийдется менять позиции остальных товаров?
Ti ну так какой толк тогда - менять id всех товаров или менять "вес" всех товаров - кол-во запросов к базе данных в обоих случаях одинаково ведь
на кой ляд менять вес всех товаров то ? ставишь по умолчанию вес = 0. и меняешь только для тех товаров, которые должны быть выше, ниже. что именно непонятно, если непонятно, в предыдущем абзаце ?
по-идее id вообще не должен играть в ORDER BY при создании поля сделать order = id при добавлении order = MAX(order)
про между вопросов, кстати не было ээ, странный топик. уже три раза повторялось что default(order) = 0, откуда взялись 0,1,2 ? 1 0 2 -1 3 1 должен, сначала сортируешь по order, а внутри - по id (чтобы отработало тот несчастный 0, кот. по умолчанию)
def обычно, подразумевается изменение порядка неоднократно Код (Text): id order 1 0 2 1 3 2 4 3 id 1 между 3 и 4 order = INT UNSIGNED
мне кажется не совсем поняли смысл моего вопроса - алгоритм, позволяющий за меньшее кол-во запросов к базе, выполняющий требуемое - повысить или понизить позицию товара в каталоге
Добавляей поле position float. А там Order by position.... ну или сделай ORDER BY rand() - и пусть позиции выставляет им фартуна =)
Ну вот интересно, разобрался иль нет с проблемой... Вообще, по-хорошему надо сказать: "Читай мануал" и указать ссылки: http://mysql.ru/man/ http://mysql.ru/faq/ Но все же попробую объяснить назовем поле вес в mysql таблиуце: `weight` назначим ему тип: ind(11) Поставим значение по умолчанию: default = 0 Все, данные в mysql таблице не трогаем, все путем. Теперь тебе надо изменить в запросе сортировку, как тебе говорили раньше и будут у тебя все элементы сортироваться по `id` если `width`==0 иначе, будут сортироваться по `width` Код (Text): id weight 1 0 2 0 3 0 4 0 5 1 6 0 И будет у тебя такой порядок: id5, 1, 2, 3, 4, 6
Может быть подойдёт способ замены? Например позиция шестая, а её нужно на третью, то тогда создать скрипт, который шестую позицию меняет с пятой, а потом пятую (бывшую шестую) меняет с четвёртой, потом четвёртую (бывшую пятой) меняет с третей и всё... или просто скрипт, который меняет позиции местами только один раз, тогда, чтоб сделать шестую позицию третьей, тебе нужно нажать на скрипт 3 раза И конечно же всё эти действия происходят не с полем id, а с другим...
Если в моем примере требуется вставить придмет межди 3 и 4-ой позицией, я задаю ему новую позицию 3.5, а скрипт приводит все в нормальный вид с целыми числами.... очень удобно. PHP: <?php /* Оптимизируем позиция */ $db_s = exec_query("SELECT * FROM $modul_table WHERE catalog_id='$modul_id' ORDER by position",0); while($s = mysql_fetch_assoc($db_s)) { $position_new++; exec_query("UPDATE $modul_table set position='$position_new' WHERE id = '$s[id]'",0); }?>