|
|
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
Добрый день! Задача: Нужно перевести текст `text` из таблицы text по словарю dict. Исходные данные: dict word_en word_rublack черныйwhite белыйgreen зеленыйblue синийbrown коричневыйred красный text idtext1Цвета обивки: brown red white и другие цвета2Цвета ткани: brown white red black и другие цвета3Цвета: red white green и другие цвета4Цвета: blue white black и другие цвета Требуемый результат: Нужно получить такой `text` textЦвета обивки: brown (коричневый) red (красный) white (белый) и другие цветаЦвета ткани: brown (коричневый) white (белый) red (красный) black (черный) и другие цветаЦвета: red (красный) white (белый) green (зеленый) и другие цветаЦвета: blue (синий) white (белый) black (черный) и другие цвета Решение: В качестве решения был выбран такой запрос, но он не работает. Переводит только первое по словарю слово (как многопроходный пример ниже). Почему? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Сейчас использую много-проходную схему. Работает, но долго, т.к. много проходов. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Исходные таблицы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. данных в таблице text 300 000 строк, словарь dict 500 слов Вопрос: Как сделать запрос с переменными рабочим и за один раз перевести всю таблицу? (т.е. нужно обойтись без многопроходности) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 14:03:27 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
diego8807, мне чего-то видится только вариант, каким-нибудь клиентским языком составить запрос где будет 500 этих самых вложенных реплейсов. Но если нужно постоянно обновлять, то конечно-же не вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 16:38:43 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
diego8807Переводит только первое по словарю слово (как многопроходный пример ниже). Почему? Потому что связывание таблиц соопоставляет ОДНУ запись из таблицы dict и ОДНУ из таблицы text. Переходя к другой записи из таблицы, он берёт запись ИЗ ДРУГОЙ ТАБЛИЦЫ, а не с предыдущей итерации. Неизменённую предыдущей итерацией. Изменения на предыдущей итерации, таким образом, потеряны. Для реализации требуемого функционала придётся задействовать переменные - точно так, как они исползуются в ФАКе по нумерации записи в группе. Читай, вникай... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 16:47:09 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
Akinadiego8807Переводит только первое по словарю слово (как многопроходный пример ниже). Почему? Потому что связывание таблиц соопоставляет ОДНУ запись из таблицы dict и ОДНУ из таблицы text. Переходя к другой записи из таблицы, он берёт запись ИЗ ДРУГОЙ ТАБЛИЦЫ, а не с предыдущей итерации. Неизменённую предыдущей итерацией. Изменения на предыдущей итерации, таким образом, потеряны. Для реализации требуемого функционала придётся задействовать переменные - точно так, как они исползуются в ФАКе по нумерации записи в группе. Читай, вникай... Этот запрос как раз и использует переменные, но не работает всеравно. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Что тут не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 16:54:31 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
diego8807Что тут не так?1) Нет понимания, как именно MySQL-сервер использует переменные. Это ни разу не PHP и не VBA, тут всё иначе... 2) Запрос написан без предварительного построения алгоритма работы. Причём алгоритма с учётом особенностей по п. 1. У тебя тупо инициализации переменных для группы нет... да что инита - самой группировки нет! о чём вообще речь... Читай ФАК ещё раз, что ли... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 16:58:36 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
Akina, если можно, по подробнее, Фак читал, но не понял. Разъясните теорию. Как должен выглядеть этот запрос? Хотя бы примерно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 17:17:11 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
Берём ФАК. Отображаем на него задачу. В ФАКе считается номер. Переменная для номера инитится нулём (или единицей? а какая в общем разница...). У тебя же должна посчитаться строка с подстановками. Значит, переменную надо инитить исходной строкой. В ФАКе для каждой записи в группе к переменной прибавляется единица. У тебя же для каждой записи должен выполняться реплейс содержимого переменной. Поскольку у тебя в группе выполняется реплейс, т.е. для строки перебираются переводы, значит, группа - при группировке по строке из text. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 17:24:28 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. не работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 17:37:46 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
diego8807, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. типа так, красоту - сам наведи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 17:40:17 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
15425811 , пункт 1. Пока не ликвидируете этот пробел, успеха не будет. PS. Я писАть для Вас запрос не буду. Мне достаточно видеть, как это нужно сделать, а дальше лень и неинтересно. Может, кто другой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 17:41:09 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
О! artas нарисовал. ТС - везучий... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 17:42:19 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
artas, большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 18:11:15 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
Akina, Заинтриговало, а почто update на сделал всё самостоятельно? Загнал пример в мускуль, попробовал и точно, заменяет только одно значение. Или я чего-то подзабыть успел? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Выборка - отработала на примере корректно: 13 записей. Да, в каждой из них заменяется только одно значение... последовательно. Вопрос, почему update пишет обновлено ... 4 записи? По идее, он должен был пробежаться столько раз по каждой, сколько раз она сджойнилась... нет? или я чего забыть успел пока с ПХП вожусь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 18:39:33 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
вот такой update: Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 18:42:23 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
AkinaО! artas нарисовал. что-то на работе не рабочее настроение... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 19:50:39 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
На больших объемах (300 000 строк и словарь 500 слов) процедура оказалась быстрее и скорость 5-ти проходной процедуры оказалась равна 1.5 скорости одного прохода по многопроходной схеме из задания. Остановился на процедуре translate: Код: 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. 31. 32. 33. 34. 35. Запрос от Artas - не дождался выполнения на больших объемах (>2000 сек) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. думаю дальше... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 22:57:31 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
diego8807На больших объемах (300 000 строк и словарь 500 слов) процедура оказалась быстрее и скорость 5-ти проходной процедуры оказалась равна 1.5 скорости одного прохода по многопроходной схеме из задания. Стоп! я не понял... эту хрень с подстановкой надо делать каждый раз? Мне с самого начала казалось, что требуется одноразово обновить данные в таблице. Кстати, это разумнее - обновить, а потом при надобности ВЫРЕЗАТЬ нахрен переводы, восстанавливая предыдущий вид. Только вместо скобок вставить что-нить залихватское, что по тексту отсутствует в принципе. Тогда если нужен перевод - заменяем это что-то на соотв. скобки, а если не нужен - вырезаем вместе с серединкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 23:40:33 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
Akina, это обновления прайс-листов инет магазина. Каждый день описание товаров перевожу из прайса поставщика. Добился более быстрого выполнения совместив оба варианта в процедуре.. в два раза быстрее и переводит точно все слова. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2014, 23:55:07 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
ааа... тогда навылет не понимаю, почему для редкой операции (раз в сутки небось, а то и реже) так важна скорость. Ну пусть пыхтит минуту, да пусть хоть две... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 08:56:31 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
Akinaааа... тогда навылет не понимаю, почему для редкой операции (раз в сутки небось, а то и реже) так важна скорость. Ну пусть пыхтит минуту, да пусть хоть две...Я вообще не понимаю, зачем реализовывать такой тормозной алгоритм - перебор каждого значения из словаря и поиск с заменой этого значения в строке текста!? Т.е., для КАЖДОГО из 500 слов словаря производится ПОЛНЫЙ проход по строке!!! Стандартный метод - разбиваем строку текста на слова и после просты циклом проходим по этим словам, ищем их вхождение в словаре и, если нашли, заменяем. После цикла склеиваем все слова обратно в строку. Все! Т.е., получаем не 500 проходов по каждой строке текста, а всего лишь столько, сколько в этой строке слов. Кроме этого, на каждом проходе не сканим всю строку заново, а всего лишь быстро из словаря по индексу ищем нужное слово. Можно это сделать или в клиентской программе или в хранимке - кому, как нравится. Если в клиентской программе, то перед переводом загружаем весь словарь в таблицу в памяти и, соответственно, не будем по каждому слову лишний раз "дергать" сервер - т.е., к базе по каждой строке текста будет всего два запроса - считать очередную строку и апдейтить её после перевода. Если в хранимке, то слова после разбора очередной строки текста хранить во временной таблице на движке MEMORY - получаем массив в памяти, с которым работаем в обычном цикле по fetch. Гарантирую - такой алгоритм во много раз будет быстрее любого из вышеприведенных или вновьпридуманных, которые пытаются приспособить SQL-запросы под несвойственные для них задачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 15:05:22 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
OlegROAСтандартный метод - разбиваем строку текста на слова и после просты циклом проходим по этим словам, ищем их вхождение в словаре и, если нашли, заменяем. После цикла склеиваем все слова обратно в строку. Все! Т.е., получаем не 500 проходов по каждой строке текста, а всего лишь столько, сколько в этой строке слов. Кроме этого, на каждом проходе не сканим всю строку заново, а всего лишь быстро из словаря по индексу ищем нужное слово. Можно пойти ещё дальше, и хранить не всю строку, а разбить её на слова и хранить сами слова. Соответственно собирать строку, когда название понадобится. А в таблице слов хранить все языки, и в зависимости от параметров брать либо один язык, либо несколько. Тогда замен делать вообще не потребуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 15:50:29 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
AkinaМожно пойти ещё дальше, ...Судя по первоначальным репликам ТС, он получает уже готовый текст, который и переводит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 16:08:19 |
|
||
|
Перевод текста по словарю (UPDATE .. INNER JOIN .. SET ..)
|
|||
|---|---|---|---|
|
#18+
OlegROAAkinaМожно пойти ещё дальше, ...Судя по первоначальным репликам ТС, он получает уже готовый текст, который и переводит.Хранит он полученный текст у себя. Распарсить его для хранения на слова - дело плёвое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2014, 16:53:47 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38529144&tid=1835384]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
13ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 187ms |
| total: | 256ms |

| 0 / 0 |
