Изменение порядка статьи

  • Автор темы friend123
  • Дата начала

friend123

Guest
Изменение порядка статьи

Народ! Требуется помощь.

Есть такое:
Pos | id
0 | 9
1 | 3
2 | 4
3 | 1

Должно быть так:
Pos | id
1 | 3
2 | 9
3 | 4
4 | 1

Т.е. все работает на основе <select>, здесь он равен 2. Я написал код, но он несовершенный:
PHP:
for($zzz=$select_pos; $zzz<$list_pos+1; $zzz++){
          $query2 = "SELECT * FROM $table10 WHERE pos=$zzz";
          $result2 = MYSQL_QUERY($query2);
          $id_zam = mysql_result($result2,0,'id');
          $pos_zam=$zzz+1;
          $query3 = "UPDATE $table10 SET pos='$pos_zam' WHERE id=$id_zam";
          $result3 = MYSQL_QUERY($query3);
}
      $query4 = "UPDATE $table10 SET pos='$select_pos' WHERE id=$id";
      $result4 = MYSQL_QUERY($query4);
где $select_pos - выбранное число (здесь 2), $list_pos - количество ненулевых позиций (здесь 3).

Естественно, если использовать мой код, то промежуточная картина будет такая:

Pos | id
1 | 3
2 | 9
3 | 4
3 | 1

Как лучше сделать?
 

Cougar

Кошак
$query3 = "UPDATE $table10 SET pos=pos+1 WHERE pos > $select_pos AND pos < " . ($list_pos + 1)

Вроде так. Одним запросом и без всяких циклов.
 

friend123

Guest
Что-то уж больно просто. Он что переместит все сам, что ль? Сомневаюсь, но попробовать стоит. А что там за точка перед кавычкой: может так $query3 = "UPDATE $table10 SET pos=pos+1 WHERE pos > $select_pos AND pos < ($list_pos + 1)"
 

Cougar

Кошак
friend123
Про точку перед кавычкой читай в мануале по PHP в разделе "операции со строками"
 

friend123

Guest
Я не понимаю ее смысла. Вот так тоже работает:

$list_pos=$kol_pos+1;
$query3 = "UPDATE $table10 SET pos=pos+1 WHERE pos>=$select_pos AND pos<$list_pos";

где $kol_pos - количество ненулевых позиций
 

Cougar

Кошак
friend123
Разумеется, смысла никакого, кроме наглядности. У тебя в цикле условие $zzz<$list_pos+1. Вот и я в запросе указал $list_pos-1 - чтобы понятнее было, к чему это.

-~{}~ 05.11.04 15:12:

Да... стормозил я... вместо условий "больше-меньше" в запросе уместнее использовать BETWEEN.
Это тебе домашнее задание. :)
 

friend123

Guest
Да я сам виноват: забыл указать, что $list_pos это и есть $kol_pos+1, т.е. $zzz<$list_pos

Нет, BETWEEN не поможет, т.к. у меня так ... WHERE pos>=$select_pos AND pos<$list_pos ,а BETWEEN подразумевает не строгое сравнение, т.е. pos будет <= $list_pos
 

Cougar

Кошак
А кто тебе мешает сказать $list_pos-- и после этого пользовать переменную в запросе? :)
 
Сверху