|
|
|
| Здравствуйте!
Вот наткнулся на такую задачу:
У нас в базе есть записи и каждая запись имеет поле "position". По этому полю идет сортировка и т.д. Допустим в базе есть 100 записей с позициями от 1 до 100 соответственно. В таблицу нужно вставить новую запись. При добавлении записи, имеется возможность ввести номер позиции. Я добавляю новую запись и указываю позицию равной 24. Теперь у нас получается такой вид позиций: "... 22-23-24-24-25..." , т.е. две позиции с номером 24. Конечно же оставить так нельзя и все это нужно отсортировать. Но как лучше проводить сортировку? В голову приходит только два варианта:
1. Это с самого начала, с первой позиции в цикле проверить на четкое увеличение позиции на 1, если идут одинаковые номера, то увеличить на 1. Таким образом скрипт проверит все данные в таблице и при этом сделает 101 запрос. А это плохо...
2. Запомнить номер позиции и с нее начать тоже самые цикл.
Но оба способа мне кажутся плохими.. и ресурсоемкими. Вот просто хочу спросить у вас алгоритм пересортировки позиций.. Как бы вы решили данную задачу? | |
|
|
|
|
|
|
|
для: FireTiger
(28.07.2008 в 20:17)
| |
UPDATE tbl SET pos = pos+1 WHERE pos > $n ;
INSERT INTO tbl (pos) VALUES ($n) ;
|
Вообще-то вопросы про работу с БД лучше постить в раздел MySQL | |
|
|
|
|
|
|
|
для: Trianon
(28.07.2008 в 20:48)
| | Извините, но я что-то не до конца понял, а что хранит переменная $n? | |
|
|
|
|
|
|
|
для: FireTiger
(28.07.2008 в 20:58)
| | можете вместо нее поставить 24 | |
|
|
|
|
|
|
|
для: Trianon
(28.07.2008 в 21:19)
| | Все, понял.. а если в базе 1000 записей, то что, будет около 1000 запросов? По другому никак? | |
|
|
|
|
|
|
|
для: FireTiger
(28.07.2008 в 21:35)
| | >Все, понял.. а если в базе 1000 записей, то что, будет около 1000 запросов? По другому никак?
По-моему, здесь количество запросов (2) никак не зависит от количества записей. | |
|
|
|
|
|
|
|
для: Trianon
(29.07.2008 в 09:49)
| | Извиняюсь... я оказывается плохо знаю sql.. Спасибо вам огромное! | |
|
|
|
|
|
|
|
для: Trianon
(29.07.2008 в 09:49)
| | Можно еще вопросик.. А если нам не нужно вставлять новую запись, а обновить уже существующую, при этом мы тоже меняем позицию на новую. Например, у нас 100 записей и мы хотим переставить запись с 24 позиции на 48. Что нам для этого нужно? Никак не могу придумать нормальный алгоритм.. как можно сделать в данной ситуации? | |
|
|
|
|
|
|
|
для: FireTiger
(29.07.2008 в 13:38)
| | поменять элементы местами?
UPDATE tbl SET pos = (24+48 - pos) WHERE pos IN (24, 48);
|
| |
|
|
|
|
|
|
|
для: Trianon
(29.07.2008 в 13:43)
| | Спасибо конечно, это тоже пригодится, но нет, не менять местами, а именно что поставить новую позицию элементу, и все отсортировать. Т.е. если мы переставляем с 24 на 48, то начиная с 24 до 48 все элементы нужно опустить на 1, а потом вставить новую позицию. Но дело в том, как мне достать старую (24) позицию, если через post передается уже новая позиция... | |
|
|
|