|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
Здравствуйте! Помогите, пожалуйста, решить такую задачу. Есть таблица contents, в которой 1,5 млн строк. Структура таблицы: Имя Тип Сравнение id int(11) utf8_general_ciname varchar(250) utf8_general_ciurl varchar(250) utf8_general_ciHEX varchar(250) utf8_general_ciHEX_new varchar(250) utf8_general_cirel_gall text utf8_general_ci Столбец rel_gall содержит в ячейках список значений с разделителем запятая. Ячейка может содержать от нуля (ячейка может быть пустой) до тридцати значений с разделителем запятая. Значения между разделителем могут содержать буквы разного регистра и цифры. (пример содержимого ячейки: cRbkmw,wiwvRDJ,ivhswa,iqexFT,hjJmkT,uiiwRnT,iklbJr,ibjTof,lvibeib,imiJoh). Столбец HEX содержит в ячейках значение, которое встречается в ячейках столбца rel_gall. Столбец HEX не уникальный, строки повторяются. Из рандомного набора значений столбца HEX и состоит ячейка столбца rel_gall. Столбец HEX_new содержит в ячейках новое значение HEX. На эти значения нам нужно обновить значения в столбце rel_gall. Нужно сопоставить каждое значение из ячейки столбца rel_gall со значениями в ячейках столбца HEX (достаточно первого совпадения) и заменить значение в ячейке rel_gall на новое значение из соседнего столбца HEX_new. Или, перефразирую: Нужно заменить в ячейке столбца rel_gall все значения HEX на значения из столбца HEX_new. Ниже покажу наглядно цветом на четвертой строке какое значение в колонке rel_gall на какое должно измениться. (Примечание: значения в столбце rel_gall разделил точкой с запятой, чтобы корректно вывести тут таблицу, в оригинале разделитель - запятая) Было: id name url HEX HEX_new rel_gall1 100-dollar-bill 100 Png Download 100-dollar-bill-100-png-download xRbhmw g3b1p5j7f3g1e1 xRbhmw;iiwmRTJ;imhhwm;imixJT;bbJmxT;iiwmRbT;imibJo2 My Name's Jess Parkinson And I'm A Yoga Instructor my-names-jess-parkinson-and-im-a-yoga bbJmxT n0m3j7v6h1w8c5 bbJmxT;oimo;iTxJRTx;mboxhb;oRbmh;hTwowo;iiwmRTJ3 Supreme 100 Dollar Bill Trucker Jacket Png Download supreme-100-dollar-bill-trucker-jacket-png-download iTohwbT q4o2p2o0o5l3p6 iTohwbT;iiTiobo;xRbhmw;hiiwRRJ;imibJo;hxThwxw;bbJmxT4 100 Dollar Bill House - 100 Dollar Bill HD Png Download 100-dollar-bill-house-100-dollar-bill-hd hiiwRRJ z6k0d2f1c0t6k6 xRbhmw;hiiwRRJ;bbJmxT;iTohwbT;imibJo;hxThwxw;imixJT5 Money In Hand - 100 Dollar Bill HD Png Download money-in-hand-100-dollar-bill-hd-png imibJo q7k4e3m1n1y3h1 mhihwJ;hihJJoh;imibJo;hxhoRmb;oimo;xbxJJh;mhwJmi Стало: id name url HEX HEX_new rel_gall1 100-dollar-bill 100 Png Download 100-dollar-bill-100-png-download xRbhmw g3b1p5j7f3g1e1 xRbhmw;iiwmRTJ;imhhwm;imixJT;bbJmxT;iiwmRbT;imibJo2 My Name's Jess Parkinson And I'm A Yoga Instructor my-names-jess-parkinson-and-im-a-yoga bbJmxT n0m3j7v6h1w8c5 bbJmxT;oimo;iTxJRTx;mboxhb;oRbmh;hTwowo;iiwmRTJ3 Supreme 100 Dollar Bill Trucker Jacket Png Download supreme-100-dollar-bill-trucker-jacket-png-download iTohwbT q4o2p2o0o5l3p6 iTohwbT;iiTiobo;xRbhmw;hiiwRRJ;imibJo;hxThwxw;bbJmxT4 100 Dollar Bill House - 100 Dollar Bill HD Png Download 100-dollar-bill-house-100-dollar-bill-hd hiiwRRJ z6k0d2f1c0t6k6 g3b1p5j7f3g1e1;z6k0d2f1c0t6k6;n0m3j7v6h1w8c5;q4o2p2o0o5l3p6;q7k4e3m1n1y3h1;hxThwxw;imixJT5 Money In Hand - 100 Dollar Bill HD Png Download money-in-hand-100-dollar-bill-hd-png imibJo q7k4e3m1n1y3h1 mhihwJ;hihJJoh;imibJo;hxhoRmb;oimo;xbxJJh;mhwJmi То есть, в столбце rel_gall значение xRbhmw должно замениться на g3b1p5j7f3g1e1, hiiwRRJ -> z6k0d2f1c0t6k6, bbJmxT -> n0m3j7v6h1w8c5, iTohwbT -> q4o2p2o0o5l3p6, imibJo -> q7k4e3m1n1y3h1 и т.д. Заранее благодарен за помощь! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2020, 13:53 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
Это итерационная задача, одним запросом не решить (ну то есть можно, но уж больно тяжёлый он получится). Рисуй хранимую процедуру. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2020, 14:15 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
Akina Рисуй хранимую процедуру. К сожалению, я не потяну. Может быть Вы поможете? Готов отблагодарить... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2020, 14:22 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
Версия-то MySQL хоть какая? И ещё - почему, скажем, "bbJmxT" заменено в rel_gall записи 4, но НЕ заменено в записях 2 и 3? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2020, 14:33 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
В принципе вот тебе решение для версии 8: Код: 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. 28. 29. 30.
Но оно так, чисто поржать - потому как даже на твоём куцем примере из 5 записей CTE1 генерит промежуточный набор из 672 записей. А на 1,5 млн. оно просто тихо скончается, не родившись. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2020, 14:58 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
Akina Версия-то MySQL хоть какая? И ещё - почему, скажем, "bbJmxT" заменено в rel_gall записи 4, но НЕ заменено в записях 2 и 3? MySQL 8 Я просто для примера на одной строке разобрал, поэтому в других строках не трогал ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2020, 15:09 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
Akina В принципе вот тебе решение для версии 8: Код: 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. 28. 29. 30.
Но оно так, чисто поржать - потому как даже на твоём куцем примере из 5 записей CTE1 генерит промежуточный набор из 672 записей. А на 1,5 млн. оно просто тихо скончается, не родившись. Спасибо, за такой оперативный ответ. Еще не протестировал, сразу вопрос, в SELECT перечисляются все столбцы в таблице. Тут в примере шесть столбцов, а по факту у меня в таблице их около 15 будет. Мне их все нужно так же перечислять? Akina Но оно так, чисто поржать - потому как даже на твоём куцем примере из 5 записей CTE1 генерит промежуточный набор из 672 записей. А на 1,5 млн. оно просто тихо скончается, не родившись. А что же длать? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2020, 15:15 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
_DenSeo_ А что же длать? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2020, 17:25 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
Akina _DenSeo_ А что же длать? Я тоже думал о нормализации... Если я правильно понимаю, то нужно разбить ячейку rel_gall на строки по одному значению, и связующим звеном тут будет колонка HEX. То есть, на группу строк со значениями из одной ячейки будет идти в колонке рядом один и тот же HEX, который был в строке с ячейкой до разбиения. И это все будет в отдельной таблице. Изображу графически. Таблица contents: id name url HEX HEX_new rel_gall1 100-dollar-bill 100 Png Download 100-dollar-bill-100-png-download xRbhmw g3b1p5j7f3g1e1 xRbhmw;iiwmRTJ;imhhwm2 My Name's Jess Parkinson And I'm A Yoga Instructor my-names-jess-parkinson-and-im-a-yoga bbJmxT n0m3j7v6h1w8c5 bbJmxT;oimo;iTxJRTx3 Supreme 100 Dollar Bill Trucker Jacket Png Download supreme-100-dollar-bill-trucker-jacket-png-download iTohwbT q4o2p2o0o5l3p6 iTohwbT;iiTiobo;xRbhmw Новая таблица с разбитыми по строкам ячейками столбца rel_gall, назовем ее related_images: id HEX rel_img1 xRbhmw xRbhmw2 xRbhmw iiwmRTJ3 xRbhmw imhhwm4 bbJmxT bbJmxT5 bbJmxT oimo6 bbJmxT iTxJRTx7 iTohwbT iTohwbT8 iTohwbT iiTiobo9 iTohwbT xRbhmw Так должно быть? Или я что то упустил или не понимаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2020, 22:50 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
_DenSeo_ Так должно быть? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.03.2020, 14:56 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
Akina _DenSeo_ Так должно быть? Первичный id. Просто HEX это идентификатор страницы, а данные в rel_gall - это значения релевантных ей страниц, которые выводятся в блоке Related на этой странице. И у себя в CMS я выводил этот блок с картинками и ссылками на related страницы запросом: Код: plsql 1.
Поэтому и думал, что HEX будет связующим... Тогда два вопроса по новой доп. таблице: 1. Колонка HEX из таблицы contents в этой новой доп. таблице не нужна? 2. Получается нужна колонка contents_id со значением id которое соответствует группе значений из одной ячейки rel_gall? Это и будет реферал в связующей таблице... То есть новая доп. таблица related_images должна выглядеть так, верно? id contents_id rel_img1 1 xRbhmw2 1 iiwmRTJ3 1 imhhwm4 2 bbJmxT5 2 oimo6 2 iTxJRTx7 3 iTohwbT8 3 iiTiobo9 3 xRbhmw Akina Плюс должна быть таблица УНИКАЛЬНЫХ HEX - она будет вторым рефералом. Сделал таблицу уникальных HEX - hex_uniq. Вставил в HEX_old столбец HEX из таблицы contents, удалил дубликаты и обновил значения id, AUTO_INCREMENT, чтобы по порядку шло. И в этой таблице в HEX_new сгенерировал новый, уникальный HEX. Генерить его в таблице contents было ошибкой, это нарушает логику, там же повторяются строки со значениями HEX. По столбцу HEX туда подставлю новые значения HEX_new из таблицы уникальных HEX, чтобы сохранить логику... Вот таблица уникальных HEX - hex_uniq. Скажите, она правильно выглядит? idHEX_oldHEX_new1bbbr9t2j8ah2bbbbbtuhk6vk3bbbbbowjsza95q4bbbbhww0342rau5bbbbih5ws0fsc46bbbbii8l0zkna87bbbbiTzyjl16hm8bbbbJJbh8f6an49bbbbJofej72gvo10bbbbJRh3q30ial ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2020, 13:09 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
_DenSeo_ Колонка HEX из таблицы contents в этой новой доп. таблице не нужна? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2020, 13:16 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
Akina _DenSeo_ Колонка HEX из таблицы contents в этой новой доп. таблице не нужна? Немного не понимаю... ИД страницы - понятно, это id из таблицы страниц. А откуда взять ИД релевантной страницы? у меня же есть только релевантные HEX? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2020, 14:14 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
HEX - они уникальны? т.е. формально пофиг, связывать по ним или по ID. Но ID числовой, по нему удобнее (да и короче, и быстрее). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2020, 15:08 |
|
Заменить в ячейке все значения на значения из другого столбца
|
|||
---|---|---|---|
#18+
Akina HEX - они уникальны? Именно в таблице страниц (contents) HEX повторяется, потому, что повторяются строки для страниц, которые относятся сразу к нескольким группам. А так, в принципе, он уникален для каждой отдельно взятой страницы. По поводу повторов HEX в таблице страниц. Я сейчас задумался, может я и тут неправильно храню данные???... или правильно... Поясню. Повторы вызваны тем, что один и тот же HEX (одна и та же страница) может относиться одновременно к нескольким группам. Вот выборка из таблицы страниц: Код: plsql 1.
idnameurlgp_idgp_urlHEXHEX_newrel_gall1100-dollar-bill 100 Png Download100-dollar-bill-100-png-download1100-dollar-billxRbhmwg3b1p5j7f3g1e1xRbhmw;iiwmRTJ;imhhwm;imixJT;bbJmxT416883Archaicawful Dollar Bill Clip Art Bills Graphic Libraryarchaicawful-dollar-bill-clip-art-bills-graphic-library3dollarxRbhmwg3b1p5j7f3g1e1xRbhmw;iiwmRTJ;imhhwm;imixJT;bbJmxT417611Archaicawful Dollar Bill Clip Art Bills Graphic Libraryarchaicawful-dollar-bill-clip-art-bills-graphic-library4dollar billxRbhmwg3b1p5j7f3g1e1xRbhmw;iiwmRTJ;imhhwm;imixJT;bbJmxT752291Archaicawful Dollar Bill Clip Art Bills Graphic Libraryarchaicawful-dollar-bill-clip-art-bills-graphic-library800libraryxRbhmwg3b1p5j7f3g1e1xRbhmw;iiwmRTJ;imhhwm;imixJT;bbJmxT Тут gp_id соответствует id группы в таблице групп - groups, и gp_url соответствует gp_url в той же таблице groups. Может нужна еще какая-нибудь дополнительная таблица? Или тут все правильно с хранением и структурой базы данных в целом? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2020, 16:09 |
|
|
start [/forum/topic.php?fid=47&fpage=24&tid=1828684]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
44ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 147ms |
0 / 0 |