powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / что-то не получаеться написать update на переназначение связаных записей.
13 сообщений из 13, страница 1 из 1
что-то не получаеться написать update на переназначение связаных записей.
    #38996268
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
значит ситуация.
есть таблица ресурсов resources(number,user_id,c1,c2,......)

number - уникальный идентификатор ресурса
user_id - ссылка на пользователя которому он назначен(0 если пока что ничейный)
c1,c2 - характеристики ресурса

и есть список идентификаторов - (аааааа,бббббб,вввввв,гггггг,.....) на 100 елементов.
Идентификаторы из списка, это ресурсы которых уже не существует, но в базе данные не актуальные.

вот задача,
для каждого ресурса из списка, найти ресурс с такимиже характеристиками и ничейный, и назначить его тому же самому пользователю.

тоесть в результате получиться, что пользователи владеющие сейчас ресурсом несуществующим, начнут владеть двумя - несуществуещим(из списка) и стакими же характеристиками существующим (не из списка)

пробовал так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
update

resources old join resource new on (old.c1 = new.c1 and old.c2 = new.c2 and 
old.number<> new.number)

where
new.user_id <> 0 and
old.number IN (<наш список идентификаторов старых ресурсов>) and
new.number NOT IN (<наш список идентификаторов старых ресурсов>)

limit 1;



лимит один, так как подобный запрос одни и теже новые ресурсы сопоставит с разными старыми и результат получиться глупым.
поэтому решил пошагово ити по одному...

но сдесь мускл ругаеться, что не верно использован лимит.

что-то пока мысли нету как быть.
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996292
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совершенно невменяемо.
Покажите пример исходных данных и желаемого результата - в том числе демонстрирующий это самое "подобный запрос одни и теже новые ресурсы сопоставит с разными старыми и результат получиться глупым", коего надо избежать.
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996300
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
номер к1 к2 пользователь

1111 1 2 100
2222 1 3 101 --два юзера с двумя битыми ресурсами

3333 1 4 0
4444 1 2 0
5555 1 2 0
6666 1 3 0
7777 1 3 0

список плохих ресурсов (1111,2222)
надо чтобы вышло

1111 1 2 100
2222 1 3 101 --два юзера с двумя битыми ресурсами

3333 1 4 0
4444 1 2 0
5555 1 2 100 -- назначеный вместо 1111 ибо по обоим критериям такойже и свободный
6666 1 3 101 -- назначеный вместо 2222 ибо по обоим критериям такойже и свободный
7777 1 3 0
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996302
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
результат простого джоина по типу запроса выше получиться, предположим что есть есчё

9999 1 2 102 - и єто тоже плохой ресурс

1111 1 2 100 4444 1 2 0 --лажа
1111 1 2 100 5555 1 2 0 --лажа
2222 1 3 101 6666 1 3 0
2222 1 3 101 7777 1 3 0
9999 1 2 102 4444 1 2 0 -лажа
9999 1 2 102 5555 1 2 0 -лажа

каждому старому(1111, 9999) найден каждый новый 4444 и 5555 по критериям к1=1 к2=2
вот этого избежать не получается...
что если например 4444 мы берём на замену 1111, то на замену 9999 уже нельзя взять 4444....
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996334
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин...когда делал пост, интуиция подсказывала....не позорься, тыж сам на раз можешь.... но видать температура дала о себе знать.


вообщем говоря - решение

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
UPDATE

resources r, # r(esources) - будем получать ресурс несуществующий
resources fr, #f(ree)r(esources) - будем искать существующий нечейный ресурс на замену выше
(select @done:='') a # - будем хранить список обработаных номеров плохих

#для найденого свободного выставляем юзера тогоже что и для найденого плохого
#также дописываем в переменую обработаный номер(старый)

set fr.user_id = IF(@done:= concat(@done,',',n.number), n.user_id,n.user_id)

where
n.number <> fn.number and #по сути это условие не надо, ибо следующие два его обеспечат
n.number IN (<list1>) and #номер из списка плохих
fn.number NOT IN (<list1>) and # на замену номер не должен быть среди плохих
fn.user_id = 0 and # номер на замену не должен быть занятым
n.user_id <> 0 and # если номер из плохого списка нечейный, мы не паримся
n.c1 = fn.c1 and #номер на замену должне иметь теже характеристики
n.c2 = fn.c2 and #номер на замену должне иметь теже характеристики
INSTR(@done,n.number) = 0 #расматриваем только плохие номера, есчё не расмотренные

#FIN
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996337
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пошол работать с базой продакшина... надеюсь не плугонул :)
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996341
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453но видать температура дала о себе знать.alex564657498765453пошол работать с базой продакшина...Вы поосторожнее там :)
А лучше бы лежать и лечиться, а то толком ни здоровья, ни работы не получится.
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996373
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,
что-то у меня слишком сложно получилось ... а ваш вариант не сработал.
Код: sql
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.
update (
  select 
    c1, c2, 
    (select count(*) 
       from res 
       where number in (select number from bad)
         and c1=r.c1 and c2=r.c2 and number<r.number
       )npp,
    number, user_id
  from res r
  where number in (select number from bad)
  )rn
join(
  select 
    c1, c2, 
    (select count(*) 
       from res
       where number not in (select number from bad)
         and c1=f.c1 and c2=f.c2 and number<f.number
       )npp,
    f.number
  from res f
  where number not in (select number from bad) and user_id=0
  )fn on fn.c1=rn.c1 and fn.c2=rn.c2 and fn.npp=rn.npp
join res f on f.number=fn.number
join res b on b.number=rn.number
set f.user_id=rn.user_id, b.user_id=-b.user_id


number c1 c2 user_id1111 1 2 -1002222 1 3 -1013333 1 4 04444 1 2 1005555 1 2 1026666 1 3 1017777 1 3 09999 1 2 -102
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996377
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007,

вариант визуально проверил...да, должно быть всё верно.
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996381
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и на фидлере посмотрел, работает. мой вариант подправив(там ошибки в алиасах, ну и <list1> нада заменить на select number from bad

вообщем работает без последнего(на один меньше апдейт чем должно быть)
а на локалке работала полностью....


вот сижу гадаю почему. есть идеи?
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996384
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ошибочка...на фидлере мой вариант только два апдейта делает.... может там ограничение какое срабатывает....
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996397
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и у меня 2 изменения сделал.
А в виртуалку лезть на mySQL лениво:)

Про вариант - хз как там что в реале, но от повторного назначения битого битым я б подстраховался. Да и отрицательные ID не пролезут через FK
...
Рейтинг: 0 / 0
что-то не получаеться написать update на переназначение связаных записей.
    #38996399
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007Вот и у меня 2 изменения сделал.
А в виртуалку лезть на mySQL лениво:)

Про вариант - хз как там что в реале, но от повторного назначения битого битым я б подстраховался. Да и отрицательные ID не пролезут через FK

я нашёл ошибку в своём.

надо не только запоминать битые номера обработанные, но и небитанные обработанные

а то получаеться,
первому битому назначаем по критериям номер1

потом второму битому с темиже критериями(параметрами с1 с2) - назначаем тотоже самый номер1 :)

итого получается, количество назначений равно количеству уникальных наборов характеристик с1,с2 :)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / что-то не получаеться написать update на переназначение связаных записей.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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