fog
Рыцарь Джедай
Зпарет повторного нахождения
Задача такая
есть две таблицы.
в первой номера телефонов и длительность разговора
id
dnis
duration
во второй коды и названия направлений (стран)
id
code
name
необходимо сгенерировать отчёт по направлениям, куда звонили, просуммировав длительность по каждому направлению.
т.е. в отчёте - все записи из второй таблицы (названия направлений), и напротив - общая длительность.
Нужно учесть, что коды есть "12" и есть "12345", при этом естественно номер направления должен совпасть с самым длинным кодом, и эта запись больше не должна учитываться, второй раз для кода "12" она уже посчитаться не должна.
---
какая была идея:
- таблица со звонками копируется во временную
- все таблицы с кодами помещаются в массив (отсортирован по длинне кода, начиная с длинных)
- массив кодов проходим, делая запрос для каждого кода "SELECT sum(duration) from tmp_calls where dnis like '$code%'"
- затем удаляем совпавшие с этим кодом записи "delete from tmp_calls where cdrs_dnis LIKE '$code%'"
- далее обратно к пункту 1.
Таким образом получается, что для каждого кода находится совпадение, затем совпавшие записи удаляются.
Всё бы хорошо, но только работает очень медленно.
Может кто-нибудь предложит как генерацию такого отчёта можно оптимизировать?
MySQL 4.0
Вот пример функции которая это делает
-~{}~ 23.01.05 13:53:
Записей в таблице направлений (стран) - примерно 3000, звонков 30,000 и будут увеличиваться в десятки раз.
Функция приведённая выше, на довольно мощном сервере отрабатывает за две с половиной минуты.
Задача такая
есть две таблицы.
в первой номера телефонов и длительность разговора
id
dnis
duration
во второй коды и названия направлений (стран)
id
code
name
необходимо сгенерировать отчёт по направлениям, куда звонили, просуммировав длительность по каждому направлению.
т.е. в отчёте - все записи из второй таблицы (названия направлений), и напротив - общая длительность.
Нужно учесть, что коды есть "12" и есть "12345", при этом естественно номер направления должен совпасть с самым длинным кодом, и эта запись больше не должна учитываться, второй раз для кода "12" она уже посчитаться не должна.
---
какая была идея:
- таблица со звонками копируется во временную
- все таблицы с кодами помещаются в массив (отсортирован по длинне кода, начиная с длинных)
- массив кодов проходим, делая запрос для каждого кода "SELECT sum(duration) from tmp_calls where dnis like '$code%'"
- затем удаляем совпавшие с этим кодом записи "delete from tmp_calls where cdrs_dnis LIKE '$code%'"
- далее обратно к пункту 1.
Таким образом получается, что для каждого кода находится совпадение, затем совпавшие записи удаляются.
Всё бы хорошо, но только работает очень медленно.
Может кто-нибудь предложит как генерацию такого отчёта можно оптимизировать?
MySQL 4.0
Вот пример функции которая это делает
-~{}~ 23.01.05 13:53:
Записей в таблице направлений (стран) - примерно 3000, звонков 30,000 и будут увеличиваться в десятки раз.
Функция приведённая выше, на довольно мощном сервере отрабатывает за две с половиной минуты.