powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выбор самого точного префикса по номеру
14 сообщений из 14, страница 1 из 1
Выбор самого точного префикса по номеру
    #39010977
At6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
At6
Гость
Всем доброго дня!
Подскажите пожалуйста такую вещь - есть база данных телефонных префиксов вида
7;Россия
79;Россия мобильные
7919; Россия МТС
7919751;Россия МТС Ставропольский край.

Как построить запрос, чтобы БД выдавала самое точное соответствие номеру - к примеру по запросу номера 79197517517 выдавала строку "7919751;Россия МТС Ставропольский край"? Задача распространенная ( телефонная маршрутизация) и скорее всего давно решенная, но гугл в решении не помог.
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011067
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запрос, показывающий частное решение в лоб
использована ф-я LOCATE (позиция первого вхождения подстроки в строку)
Код: sql
1.
2.
3.
4.
5.
6.
select tt.*  FROM (SELECT '1' AS a, '1111111' AS b FROM dual UNION ALL
  SELECT '12','2222222' UNION ALL
  SELECT '123','33333333' UNION ALL
  SELECT '1234','44444444444' UNION ALL 
  SELECT '12345','55555555555') AS tt where LOCATE (tt.a, '123987654') 
  ORDER BY tt.a DESC LIMIT 1

конкретная реализация зависит от ваших данных, других вариантов также очень много (т.к. возможных строковых функций, которые можно применить, очень много)
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011070
At6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
At6
Гость
В общем пока ждал подсказки, накопал вот такой мануал - http://voxlink.ru/kb/asterisk-configuration/region-russia/.
Там предлагают сделать так-
Код: sql
1.
2.
select name from destinations where prefix in (substr('${CALLERID(num)}',2,7),substr('${CALLERID(num)}',2,6),substr('${CALLERID(num)}',2,5),
substr('${CALLERID(num)}',2,4),substr('${CALLERID(num)}',2,3)) order by length(prefix) DESC limit 1;


Может и не совсем правильно, но со своей задачей справляется- выдает самый длинный соответствующий номеру префикс.
В моем случае это выглядело так -
Код: sql
1.
2.
select route_id from prefixes where prefix in (substr('${CALLERID(num)}',1,7),substr('${CALLERID(num)}',1,6),substr('${CALLERID(num)}',1,5),
substr('${CALLERID(num)}',1,4),substr('${CALLERID(num)}',1,3)) order by length(prefix) DESC limit 1;
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011071
At6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
At6
Гость
Alex_Ustinov, спасибо, примерно такое решение и нашел.
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011084
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может так?
Код: sql
1.
2.
where inputedparam like concat (t.phone,'%')
order by length..
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011094
At6
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
At6
Гость
bochkov,
Код: sql
1.
2.
3.
4.
5.
6.
7.
mysql> select *  from prefixes where 79197517517 like concat (prefix,'%') order by length(prefix) DESC limit 1;
+---------+----------------+----------+
| prefix  | region         | route_id |
+---------+----------------+----------+
| 7919751 | Russia MTS STV |        5 |
+---------+----------------+----------+
1 row in set (0.00 sec)


Однозначно лучше первого решения, спасибо!
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011182
At6,

множественный JOIN по подстроке.
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011273
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
At6Однозначно лучше первого решения, спасибо!Чем же лучше? Логически точное такое же, а LOCATE обычно работает чуток быстрее, чем LIKE.
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011366
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

неоднозначное решение в данном виде
locate может зацепить внутренне вхождение, например "7911" и "7921...7911"
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011378
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovmiksoft,

неоднозначное решение в данном виде
locate может зацепить внутренне вхождение, например "7911" и "7921...7911"Это легко фиксится добавлением сравнения с единицей.
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011396
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, точно, писал из головы, голова недодумала...
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #39011420
At6,

кстати, тема - жуткий баян :)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Выбор самого точного префикса по номеру
    #40076802
ashmig
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
At6
bochkov,
Код: sql
1.
2.
3.
4.
5.
6.
7.
mysql> select *  from prefixes where 79197517517 like concat (prefix,'%') order by length(prefix) DESC limit 1;
+---------+----------------+----------+
| prefix  | region         | route_id |
+---------+----------------+----------+
| 7919751 | Russia MTS STV |        5 |
+---------+----------------+----------+
1 row in set (0.00 sec)


Однозначно лучше первого решения, спасибо!


Некропост, но решил, что другим может быть полезно.
Указанный запрос не оптимален с точки зрения поиска (происходит fulltable scan + filesort).

Чтобы этого избежать:
1. Добавьте index на столбец prefix
2. Добавьте дополнительный столбец prefix_len со значением длины prefix
3. Добавьте index на столбец prefix_len

В итоге у нас будет using where и backward index scan, filtered 100.0 и rows 1, вместо всех столбцов.
...
Рейтинг: 0 / 0
Выбор самого точного префикса по номеру
    #40076818
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
At6
Подскажите пожалуйста такую вещь - есть база данных телефонных префиксов вида

Раз уж подняли эту тему...
Таблицу делал человек ничего не желающий знать про основы теории реляционных отношений.
В таблице:
Первая цифра - страна.
Вторая - тип номера
3,4 - оператор
следующие 3 - регион.
Чтобы построить твой запрос надо взять номер, выделить токены, сделать поиск по этим токенам.
То есть:
token_type:
id name1 country2 sergment3 operator4 region

token:
id token_type token name1 1 7 Россия2 2 9 мобильные3 3 19 МТС4 4 751 Ставропольский край

И потом как-то так:
Код: sql
1.
2.
3.
4.
5.
select group_concat(name) from token 
where (token_type = 1 and token = substr(phone_number, 1, 1)) and 
          (token_type = 2 and ...) and
          (...) 
order by token_type;



Тут в форумах по БД почему-то из раза в раз упорно принимают предложенную ТСом схему говна за константу и пытаются под неё делать такие же запросы.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выбор самого точного префикса по номеру
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]