Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Произвольная сортировка в CMS
 
 автор: LouD   (27.12.2007 в 11:46)   письмо автору
6.7 Кб
 
 

Доброго времени суток!

Поиск курить пробовал, но вроде похожей ситуации не нашел.
Имеем сайт с каталогом товаров. Структура либо 2-х, либо 3-х уровневая.
Пример 3-х уровневой структуры тут

Менеджер магазина хочет иметь возможность расставлять товары в том порядке, как ему хочется. Это в CMS реализовано следующим образом:
каждый объект каталога (группа, подгруппа, конкретный товар) кроме своего уникального id имеют еще и номер положения в выдаче. Этот номер уникален в пределах определенной группы, но в целом по базе он может повторяться неоднократно. Система работает, если надо переставить товар пошагово - на каждом клике он обменивается позицией с рядом стоящим.

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

Но сейчас количество товаров увеличилось, и гнать кнопочками товар на 40 позиций - уже менеджера стало утомлять. Попросили сделать вариант перемещения не по одной позиции, а более "быстрый".

И вот вопрос:
Как с минимальными затратами производительности сервера переписать значительную часть таблицы?
Ведь если мне, условно говоря, надо перекинуть продукт с позиции 40 на позицию 5 - то для всех продуктов с 5-й по 39-ю позиции надо переписать их код позиции, сместив на 1, а в образовавшееся 5-е место поставить перемещаемый продукт.

Что можно придумать?
Я пока придумал только вынести столбец кода позиции в отдельную таблицу, чтобы переписывать, по крайней мере, было меньше столбцов в каждой строке. Немного это поможет, но решение больше на костыль похоже, ИМХО.. хотелось бы чего-то получше.

   
 
 автор: elenaki   (27.12.2007 в 13:17)   письмо автору
 
   для: LouD   (27.12.2007 в 11:46)
 

мы делали так - порядок определяется дробным числом. сначала всем товарам присваивается
целое число в качестве его позиции в списке. если понадобится вставить еще один товар (или
переставить уже существующий), например, между 2-м и 3-м. ему дается порядок 2.5. если вам
мало 99 позиций, которые можно впихнуть между 2.00 и 3.00, сделайте три знака после запятой.

   
 
 автор: LouD   (27.12.2007 в 16:58)   письмо автору
 
   для: elenaki   (27.12.2007 в 13:17)
 

как вариант, интересное решение :)

но, правда, все равно тут есть как минимум парочка минусов..
- самый первый номер.. он когда-то же дойдет до минимума, от которого отнимать будет уже нечего
- наличие "дырок" в перечне. мы просто меняем шаг, а с тем же успехом можно было бы писать 100,200,300... потом по мере необходимости использовать 110 и 290, потом 99 и 301 ну и т.п.

   
 
 автор: LouD   (27.12.2007 в 18:06)   письмо автору
 
   для: LouD   (27.12.2007 в 11:46)
 

В общем, на тестовом примере вида

$sql="
UPDATE LOW_PRIORITY shopmap_positions
SET position=(position+1)
WHERE ((position>=2) AND (position<5))
";
$res=mysql_query($sql)
    or die(print_mysql_error($sql));

(промежуточные настройки я опустил тут) для 19 записей время выполнения что-то вроде 0.01187801361084 s. Я думаю, даже если записей будет 2000, это примерно в 100раз больше - получается чуть больше секунды; подождет пользователь... :)

   
 
 автор: LouD   (29.12.2007 в 10:20)   письмо автору
 
   для: LouD   (27.12.2007 в 18:06)
 

ну и до кучи, чтоб уж не быть голословным:

Elapsed time: 0.11853003501892sec., number of affected rows: 319

это данные с "боевого" сервера, снятые только что.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования