Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Организация очереди. FireBird. / 22 сообщений из 22, страница 1 из 1
30.07.2004, 16:38:02
    #32629883
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Дано:

- набор записей (ну, например, записи о заказах - табличка ORDERS), в записи есть поле - Priority - приоритет. Integer. Nullable.

Требуется:

- при изменении значения Priority последовательность значений должна изменятьс так, чтобы получалась цепочка из значений от 1 до N. То же самое - при удалении, об NULL -ении и при вводе значений <=0 или > Count(*) where Priority is not nill

Например, был набор записей:

Код: plaintext
1.
2.
3.
4.
5.
6.
Id Priority Name

 1    1         Первый
 2    2         Второй
 3   Null     Третий
 4    3         Четвертый
 5   Null     Пятый

Меняем значение Priority 3-й записи с Null на 2. Должно получиться:


Код: plaintext
1.
2.
3.
4.
5.
6.
Id Priority Name

 1    1         Первый
 2    3         Второй
 3    2         Третий
 4    4         Четвертый
 5   Null     Пятый

Как бы лучше реализовать?
...
Рейтинг: 0 / 0
30.07.2004, 16:44:30
    #32629902
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Перед изменением
Код: plaintext
1.
UPDATE Table SET Priority=Priority+ 1  
WHERE Priority>=<вставляемое значение>
...
Рейтинг: 0 / 0
30.07.2004, 16:48:20
    #32629908
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
JohnmenПеред изменением
Код: plaintext
1.
UPDATE Table SET Priority=Priority+ 1  
WHERE Priority>=<вставляемое значение>


А если изменяемое значение, а не вставляемое?
...
Рейтинг: 0 / 0
30.07.2004, 17:05:15
    #32629941
vis
vis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
решение "в лоб" - использовать генератор,
установить генератор в Priority
сделать апдейт поля Priority для записей, у которых Priority>вставляемого
...
Рейтинг: 0 / 0
30.07.2004, 17:06:17
    #32629944
vis
vis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
visрешение "в лоб" - использовать генератор,
установить генератор в Priority
сделать апдейт поля Priority для записей, у которых Priority>вставляемого
эээ...уууу... в спешке "прогнал"
...
Рейтинг: 0 / 0
30.07.2004, 17:06:56
    #32629945
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
visрешение "в лоб" - использовать генератор,
установить генератор в Priority
сделать апдейт поля Priority для записей, у которых Priority>вставляемого

А когда коннектов/юзеров много? И когда не вставка - а изменение (т.е. перемещение, по сути)?
...
Рейтинг: 0 / 0
30.07.2004, 17:11:29
    #32629956
vis
vis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
visрешение "в лоб" - использовать генератор,
установить генератор в Priority
сделать апдейт поля Priority для записей, у которых Priority>вставляемого

что-то типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
set generator priority_id to :current_priority;
for select id,priority 
     from _table_ 
     order by priority 
     into :id, :priority
do
     update _table_ set priority=gen_id(priority_id, 1 );
...
Рейтинг: 0 / 0
30.07.2004, 17:15:10
    #32629966
vis
vis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
mv JohnmenПеред изменением
Код: plaintext
1.
UPDATE Table SET Priority=Priority+ 1  
WHERE Priority>=<вставляемое значение>


А если изменяемое значение, а не вставляемое?

тогда, наверное будет
Код: plaintext
1.
UPDATE Table SET Priority=Priority+ 1  
WHERE Priority > _изменяяемое_значение_
:)
...
Рейтинг: 0 / 0
30.07.2004, 17:16:07
    #32629968
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
1. Генератор опасно. Юзеров много, данных много, выборки на самом деле сложные (и не очень быстрые), а эта собака генератор работает вне контекста транзакций.

2. А что по поводу не встаки, и перемещенияв очереди/изменения?
...
Рейтинг: 0 / 0
30.07.2004, 18:39:51
    #32630113
doroshka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
А если что-то типа такого сделать.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
create procedure change_priority(id integer, priority integer)
as
declare variable old integer;
declare variable pr integer;
begin
   select priority from table_name where id=:id into :old;
   if old is null then begin
     UPDATE table_name SET Priority=Priority+ 1  
     WHERE Priority>=:priority
     exit;
   end
   if priority is null then begin
     UPDATE table_name SET Priority=Priority- 1  
     WHERE Priority>=:old
     exit;
   end
   if old<priority then begin
     for select priority from table_name 
          where priority between :old+ 1  and :priority+ 1 
          into :pr 
     do begin
       update table_name set priority=priority- 1  where priority=:pr
     end
     exit;
   end
   if old>priority then begin
     for select priority from table_name 
          where priority between :old and :priority
          into :pr 
     do begin
       update table_name set priority=priority+ 1  where priority=:pr
     end
     exit;
   end
end
Это чтоб по-быстрому сделать... Может как-то можно замутить с рекурсией. Но... Жарко, лень думать ;)
В приведенном тексте наверняка куча глюков. Но направление есть, если надо сам добъешь :)
...
Рейтинг: 0 / 0
02.08.2004, 14:04:45
    #32631428
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Не думаю, что с рекурсией нужно.

Думаю, у тебя - примерно то, что нужно.

Спасибо.
...
Рейтинг: 0 / 0
02.08.2004, 14:54:31
    #32631567
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
>mv
>А если изменяемое значение, а не вставляемое?
>Id Priority Name

1 1 Первый
2 3 Второй
3 2 Третий
4 4 Четвертый

Т.е. м.б. ситуация, когда Priority=2 меняем на Priority=7 или 1 ???
...
Рейтинг: 0 / 0
02.08.2004, 16:54:31
    #32631853
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Да, может.
...
Рейтинг: 0 / 0
02.08.2004, 17:06:30
    #32631884
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Тогда нужна полная логика поведения.
(Т.е. что произойдет с 7, если есть, что - с 2 и т.д.)
...
Рейтинг: 0 / 0
02.08.2004, 17:08:45
    #32631889
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Если 2-й станет 7-м, то все, кто были ранее 3-м...7-м, станут 2-м ... 6-м соотвентственно, а все остальные не изменятся.
...
Рейтинг: 0 / 0
02.08.2004, 17:09:45
    #32631892
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Ну, и, естественно, 2-й все-таки станет 7-м.
...
Рейтинг: 0 / 0
03.08.2004, 10:50:51
    #32632625
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
>mv

Понятно. Имеем циклический сдвиг вперед или назад в заданном отрезке.
Вобщем
"вперед": N+(i+1-N) mod (M-N+1) здесь M меняем на N,
"назад": N+(i+M-N-N) mod (M-N+1) здесь N меняем на M,
везде M>=N.

Всё это можно реализовать одним запросом, если разрешить использовать CASE.
...
Рейтинг: 0 / 0
03.08.2004, 12:12:50
    #32632887
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Одним запросом?
...
Рейтинг: 0 / 0
03.08.2004, 13:38:31
    #32633261
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Ну да. Апдейт. А что такого ?
:)
...
Рейтинг: 0 / 0
03.08.2004, 13:39:26
    #32633264
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Ну, уж не знаю, как еще намекнуть, что не понимаю, как это сделать...
...
Рейтинг: 0 / 0
03.08.2004, 14:32:45
    #32633437
Johnmen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
>mv

Заставляешь напрягаться старого больного человека ?
:)

Примерно так.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
UPDATE Table SET Priority=
  CASE WHEN PriorityNew<PriorityOld 
       THEN PriorityNew+
         CASE WHEN Priority+ 1 -PriorityNew>=PriorityOld-PriorityNew+ 1  
              THEN Priority-PriorityOld
              ELSE Priority+ 1 -PriorityNew 
         END
       ELSE PriorityOld+
         CASE WHEN Priority+PriorityNew-PriorityOld-PriorityOld>=PriorityNew-PriorityOld+ 1 
              THEN Priority-PriorityOld- 1 
              ELSE Priority+PriorityNew-PriorityOld-PriorityOld 
         END
  END
WHERE 
  (Priority>=CASE WHEN PriorityNew<PriorityOld THEN PriorityNew ELSE PriorityOld END) AND 
  (Priority<=CASE WHEN PriorityNew<PriorityOld THEN PriorityOld ELSE PriorityNew END) 

Где PriorityOld заменяемое значение Priority на PriorityNew.
...
Рейтинг: 0 / 0
03.08.2004, 14:45:07
    #32633468
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Организация очереди. FireBird.
Век живи - век учись. Не приходило в голову, что Case можно напрямую в Update запросе юзать. Спасибо.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Организация очереди. FireBird. / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]