а точнее это основной запрос биллинга. соответвенно наиболее охраняемая тайна. бесплатно можно посмотреть в a2billing.org например.
meral (Aug 13 '13)editмой вариант - написать процедурку где в отсортированной таблице, как советует meral, по длине кода взять кусок этой таблицы с id начиная с первой цифры искомого номера + длина макс возможного префикса, при этом отсортировать результирующую подтаблицу в обратном порядке. по этой подтаблице итерировать для поиска правильного кода. всего один SELECT и один LOOP - не считая опр. макс длины префикса :) в постгрезе еще проще - там есть рекурсивные запросы и массивы, то есть и процедурку делать не надо :) не забудьте про индексы...
octopas (Aug 15 '13)editкак так не работает? а индексы на что? есть базка префиксов операторская - ровно 30к, откуда больше, просто интересно.. честно... :-) самый горбатый запрос - ~127мс, там без сортировок, с несколькими проходами по таблице, но возможно и скорее всего постгрес оптимизирует запросы внутри функции - не смотрел что выходит через EXPLAIN. не думаю что mysql сильно отличается по производительности... для оффлайн биллинга с миллионами звонков - согласен, да. но ведь я так понял человеку не это нужно...
octopas (Aug 16 '13)editSELECT * FROM directions WHERE name IN ('7','74','495','74951','749512','7495123','74951234','749512345','7495123456','74951234567') ORDER BY LENGTH(name) DESC LIMIT 1; Total runtime: 3.489 ms на 30-ке тыс записей (индекс btree). потом правда еще несколько раз придется просканировать таблицу чтобы подняться вверх по дереву к нужному типу префикса через цепочку parent...
octopas (Aug 16 '13)editвот вам табличка, тестируйте http://pro-sip.net/temp/rate.csv . первая попавшееся, 4мб размерчик.
meral (Aug 16 '13)edit