Передвижение позиций в БД

Некто

Guest
Передвижение позиций в БД

Рисую ситуацию:

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

Так вот. Допустим я создам столбец и буду туда заносить номер(число). По этому числу я буду сортировать таблицу. Но ведь при удалении позиции в номерах буду появляться дырки.

А теперь возникает вопрос, а если мне надо поменять позиции местами? Т.е. поменять их числа. Как это лучше сделать?
 

mike

pmcoder
Но ведь при удалении позиции в номерах буду появляться дырки.
На сортировку это никак не повлияет

Для того чтообы поменять местами делаеш 2 РАЗА UPDATE
для каждого элемента
 

Некто

Guest
А плдробнее? Я честно не врубаюсь. :+(
 

SnowB

Guest
Re: Передвижение позиций в БД

Автор оригинала: Некто
Но ведь при удалении позиции в номерах буду появляться дырки.
И что такого? Сортировка от этого не пострадает...

Автор оригинала: Некто
А теперь возникает вопрос, а если мне надо поменять позиции местами? Т.е. поменять их числа. Как это лучше сделать?
Делать UPDATE в двух строках.

-~{}~ 12.08.05 12:33:

Автор оригинала: Некто
А плдробнее? Я честно не врубаюсь. :+(
http://dev.mysql.com/doc/mysql/ru/update.html
 

Некто

Guest
И что такого? Сортировка от этого не пострадает...
От этого пострадает смена позиций(смена их значений(чисел))

-~{}~ 12.08.05 12:53:

Я же не могу знать число которое сверху.
 

mike

pmcoder
Интересно как?

Ну и что. Тебе не надо этого знать.
Допустим ты хочешь поменять местами 2 строки.
Выбери их СЕЛЕКТОМ(SELECT) узнай значения столбца приоритета и поменяй АПДЕЙТОМ(UPDATE) их местами...

...
 

tashkentchi

Новичок
Ниже приведен упрощенный кусок рабочего кода. Меняет местами пункты меню.
`a_top_menu` - таблица, в которой хранятся пункты меню.
`RULES` - поле, по которому осуществляется сортировка записей, - тип tinyint, НЕУНИКАЛЬНОЕ (это важно).
$ed_id - идентификатор редактируемой записи.
$rules = 0, если редактируемая запись должна выводиться первой,
либо
$rules = значению `RULES` записи, ПОСЛЕ КОТОРОЙ должна выводиться редактируемая.
PHP:
$sql = 'SELECT `RULES` FROM `a_top_menu` WHERE `ID`='.$ed_id;
$result = mysql_query($sql) or die(mysql_errno().mysql_error());
$oldRules = 0;
if ( $data = mysql_fetch_array($result) ) $oldRules = $data['RULES'];
$newRules = $rules;
if ( $oldRules < ($rules - 1) ) {
   $sql = 'UPDATE `a_top_menu`
      SET `RULES`=`RULES`-1 WHERE `RULES`>'.$oldRules.' AND `RULES`<'.$rules;
   --$newRules;
}
if ( $oldRules > $rules ) {
   $sql = 'UPDATE `a_top_menu`
      SET `RULES`=`RULES`+1 WHERE `RULES`<'.$oldRules.' AND `RULES`>='.$rules;
}
if ( $oldRules != ($rules - 1) ) {
   mysql_query($sql) or die(mysql_errno().mysql_error());
}
$sql = 'UPDATE `a_top_menu` SET `RULES`='.$newRules.' WHERE `ID`='.$ed_id;
mysql_query($sql) or die(mysql_errno().mysql_error());
 
Сверху