Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
Есть табличка для телефонии в иде prefix | oper ------------- 7095 | 1 70951 | 2 7096 | 1 70962 | 2 70966 | 3 Далее ко мне приходит 70951234567 Мне нужно поймать максимальное совпадение поля prefix к пришедшему номеру. Вот думаю как сделать как все покрасивее :). Записей может быть до нескольких десятков тысяч в таблице, запросов для начала до 5 в секунду, дальше и больше. Щас наскору руку спрашиваю так SELECT max(prefix) from routes where '70951234567' like prefix||'%' ну это блин не красиво выглядит ), тем более что еще придеться еще кучу других вычислений в запросе делать. Мож кто скажет как сделать этот запрос по красивее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2005, 12:34 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
на скорую руку возникла приблизительно такая идея: select * from routes where 70951234567 between prefix*10^(char_length('70951234567')-char_length(prefix)) and ( prefix*10^(char_length('70951234567')-char_length(prefix)) +10^(char_length('70951234567')-char_length(prefix))-1 ) можно помудрить с этим, думаю это быстрее like будет, но походу выглядит еще более уродски :) правда еще вопрос какого типа поле prefix? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2005, 17:03 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
Развивая: т.к. between работает и с текстом (проверяю) Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2005, 18:57 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
assabetween prefix and prefix||'9'ошибка: select '70959876543' between '7095' and '7095'||'9'; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2005, 19:50 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
'70951234567' like prefix||'%' ужо очень сомневайсь про индекс... парент в лайке далеко не константа хоть и в начале. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2005, 19:54 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
Если длина префиксов ограничена (как в примере - 4 и 5 символа), то можно построить несколько частичных индекса для каждой из длин. Но запрос тогда придется разбить на несколько частей, объединенных по UNION, чтобы частичные индексы использовались. Вроде такого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 05:22 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
1/ LeXa NalBat assabetween prefix and prefix||'9'ошибка: select '70959876543' between '7095' and '7095'||'9'; правим: select '70959876543' between '7095' and '7095'||'a'; 2/ индекс и для between не пользуется (там выражения от prefix -> нужны ф-ные индексы) 3/ быстрее всего по фффф, но можно как то так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 10:42 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
в тако случае проще сделать простой индекс по prefix,и телефон урезать до max(char_length(prefix)) символов слева и сравнивать простым = ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 10:54 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
wbearв тако случае проще сделать простой индекс по prefix,и телефон урезать до max(char_length(prefix)) символов слева и сравнивать простым = и окажется, что обрезанный телефон не имеет тчоного =, а надо обрезать истчо одну (2,3) букк-фу. Т.ч. надо открошить все варианты длин. Если не нравится джон, то открошить в строку stroka через запятую , и делать через EXECUTE 'SELECT ... WHERE prefix IN('||stroka||')' (чё плохо тем, что может быть только в ф-ии) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 11:19 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
точно , сорру, это я что то неподумавши ляпнул . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2005, 12:16 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
В приципе все балее менее ясно. Завтра на работе погоняю по базе посмотрю что и как. А еще есть такая идея. Длина префикса может быть от 1 знака до 11. поле тип varchar(16) Те всю 7 выбрать на 1 оператора, а 70951234567 на 2. У меня такая мысль. Так как я все делаю в ф-ии. То беру и с конца начинаю отрезать по одному знаки и по "=" искать простым селектом, пока мне не вернуться данные. Правда запросов будет куча но они все будут без возврата данных. Тк чаще префикс от 2-5 знаков, те 11 - (2-5)= 6-9 запросов селект. но с простым условием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2005, 21:12 |
|
||
|
Помогите с запросом.
|
|||
|---|---|---|---|
|
#18+
Блин тестирую пока везде одинаковая производительность. Все запросы у меня по 20 мсек. Мож руки дойдут напишу прогу которая сгенерит файл с кучей запросов (тыщ 10). и погонять базу. ЗЫ. Вот здесь сошлись как у меня сначала. /topic/116302&hl= Более того автор то топика сидит от меня в 2 метрах. Вот так то все сразу в форумы кидаються ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2005, 10:18 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=32860809&tid=2007500]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
| others: | 277ms |
| total: | 426ms |

| 0 / 0 |
