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

Форум MySQL

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

 

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

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

тема: Вставка позиции и пересортировка
 
 автор: FireTiger   (28.07.2008 в 20:17)   письмо автору
 
 

Здравствуйте!
Вот наткнулся на такую задачу:
У нас в базе есть записи и каждая запись имеет поле "position". По этому полю идет сортировка и т.д. Допустим в базе есть 100 записей с позициями от 1 до 100 соответственно. В таблицу нужно вставить новую запись. При добавлении записи, имеется возможность ввести номер позиции. Я добавляю новую запись и указываю позицию равной 24. Теперь у нас получается такой вид позиций: "... 22-23-24-24-25..." , т.е. две позиции с номером 24. Конечно же оставить так нельзя и все это нужно отсортировать. Но как лучше проводить сортировку? В голову приходит только два варианта:
1. Это с самого начала, с первой позиции в цикле проверить на четкое увеличение позиции на 1, если идут одинаковые номера, то увеличить на 1. Таким образом скрипт проверит все данные в таблице и при этом сделает 101 запрос. А это плохо...
2. Запомнить номер позиции и с нее начать тоже самые цикл.
Но оба способа мне кажутся плохими.. и ресурсоемкими. Вот просто хочу спросить у вас алгоритм пересортировки позиций.. Как бы вы решили данную задачу?

  Ответить  
 
 автор: Trianon   (28.07.2008 в 20:48)   письмо автору
 
   для: FireTiger   (28.07.2008 в 20:17)
 

UPDATE  tbl    SET pos = pos+1  WHERE pos > $n ;
INSERT INTO tbl (pos) VALUES ($n) ;


Вообще-то вопросы про работу с БД лучше постить в раздел MySQL

  Ответить  
 
 автор: FireTiger   (28.07.2008 в 20:58)   письмо автору
 
   для: Trianon   (28.07.2008 в 20:48)
 

Извините, но я что-то не до конца понял, а что хранит переменная $n?

  Ответить  
 
 автор: Trianon   (28.07.2008 в 21:19)   письмо автору
 
   для: FireTiger   (28.07.2008 в 20:58)
 

можете вместо нее поставить 24

  Ответить  
 
 автор: FireTiger   (28.07.2008 в 21:35)   письмо автору
 
   для: Trianon   (28.07.2008 в 21:19)
 

Все, понял.. а если в базе 1000 записей, то что, будет около 1000 запросов? По другому никак?

  Ответить  
 
 автор: Trianon   (29.07.2008 в 09:49)   письмо автору
 
   для: FireTiger   (28.07.2008 в 21:35)
 

>Все, понял.. а если в базе 1000 записей, то что, будет около 1000 запросов? По другому никак?

По-моему, здесь количество запросов (2) никак не зависит от количества записей.

  Ответить  
 
 автор: FireTiger   (29.07.2008 в 12:42)   письмо автору
 
   для: Trianon   (29.07.2008 в 09:49)
 

Извиняюсь... я оказывается плохо знаю sql.. Спасибо вам огромное!

  Ответить  
 
 автор: FireTiger   (29.07.2008 в 13:38)   письмо автору
 
   для: Trianon   (29.07.2008 в 09:49)
 

Можно еще вопросик.. А если нам не нужно вставлять новую запись, а обновить уже существующую, при этом мы тоже меняем позицию на новую. Например, у нас 100 записей и мы хотим переставить запись с 24 позиции на 48. Что нам для этого нужно? Никак не могу придумать нормальный алгоритм.. как можно сделать в данной ситуации?

  Ответить  
 
 автор: Trianon   (29.07.2008 в 13:43)   письмо автору
 
   для: FireTiger   (29.07.2008 в 13:38)
 

поменять элементы местами?
UPDATE tbl SET pos = (24+48 - pos) WHERE pos IN (24, 48);

  Ответить  
 
 автор: FireTiger   (29.07.2008 в 14:01)   письмо автору
 
   для: Trianon   (29.07.2008 в 13:43)
 

Спасибо конечно, это тоже пригодится, но нет, не менять местами, а именно что поставить новую позицию элементу, и все отсортировать. Т.е. если мы переставляем с 24 на 48, то начиная с 24 до 48 все элементы нужно опустить на 1, а потом вставить новую позицию. Но дело в том, как мне достать старую (24) позицию, если через post передается уже новая позиция...

  Ответить  
Rambler's Top100
вверх

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