@wb_by
Учусь

Как найти телефон в sql с помощью match against?

Есть бд где все номера храняться в форматированном виде:

+7 (917) 842-43-66

Нужно как то построить sql запрос чтобы при вводе в строку поиска что-то типа 791784 (или +7(917)84) выдавались номера с этими цифрами и именно в таком порядке (а то поиск будет не очень эффективным). Грубо говоря настроить игнор всего кроме цифр и их порядка. Не совсем понимаю как это реализовать с помощь полнотекстового поиска. Возможно саму строку из поиска формировать в телефон как в бд? Или я просто не знаю как правильно запрос простроить? Все к чему я пришел строку поиска приводить к виду *7*9*1*7*8*4* , но это выдает все номера с этими цифрами. Заранее благодарю за помощь
  • Вопрос задан
  • 828 просмотров
Решения вопроса 1
erge
@erge
Примус починяю
UPD:
немного неверно написал ранее, т.к. это поиск по части номера, то естественно надо LIKE
$sql = "SELECT * FROM tbl WHERE replace(replace(replace(replace(phone,'(',''),')',''),' ',''),'-','') LIKE concat(replace(replace(replace(replace('".$num."','(',''),')',''),' ',''),'-',''), '%')";


UPD2:
PS:
Не совсем понимаю как это реализовать с помощь полнотекстового поиска.

а зачем вообще реализовывать это с помощью полнотекстового поиска??
если номер телефона хранится в отдельном поле, в определенном формате?
  1. либо приводите обе стороны "искомого" к одному формату (т.е. удаляете все лишнее) как например выше.
  2. либо, если номера в базе хранятся в одном формате приводите искомый (вводимый) номер к формату хранения в базе + знак % и поиск LIKE
  3. либо делаете поиск через REGEXP соответствующим образом формируя рег.выражение из PHP
    но это несколько сложнее, надо ее динамически формировать в зависимости от введенных цифр.
    вот регулярка для проверки телефона практически в любом варианте написания:
    ^\+?7[ -]?\(?\d{3}\)?[ -]?\d{3}[ -]?\d{2}[ -]?\d{2}$

    под MySQL сами перепишите... см. ссылку выше, там другие классы символов.
  4. либо, если все же таки нужен полнотекстовый поиск, то искомое значение НЕОБХОДИМО приводить к формату в базе и искать отформатированное значение
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@d-stream
Готовые решения - не подаю, но...
Вообще хорошая практика хранить в базе именно номер, а маску применять отдельно для отображения. Тогда все заметно упрощается. При дальнейшем прогрессе country code и возможно area code - можно тоже вынести...
Ответ написан
Комментировать
BasiC2k
@BasiC2k
.NET developer (open to job offers)
Надо бы понять какая СУБД Вами используется и какая версия.
В общем случае, при запросе можно удалить лишние символы через REPLACE. Скорее всего потребуется замена скобок, пробела и тире.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы