Поиск нескольких форматов телефонных номеров через PHP из MySQL

Поиск номера телефона в таблице базы данных MySQL с двумя или более столбцами полей телефона, имеющих номер телефона в разных форматах

У меня есть таблица базы данных с 2 columns - phone and mobile.

Обе колонки имеют номера телефонов в разных форматах, таких как:

+(91) 950-232-9020
+91 950-232-9020
+91 9502329020
09502329020

Из моего PHP-скрипта, если я хочу найти номер телефона ‘9502329020’,
Я хочу вернуть 4 строки.

Пока я нашел 1 решение с помощью % после каждой цифры как:

Select * from table
where phone like '%9%5%0%2%3%2%9%0%2%0' or
mobile like '%9%5%0%2%3%2%9%0%2%0';

Но если мне придется искать миллионы строк, мне нужно оптимизированное решение.

Может кто-нибудь помочь мне с оптимизированным решением, чем-то вроде использования регулярных выражений в запросе MYSQL.

Примечание. При сохранении в базе данных телефонные номера сохраняются в удобных для пользователя форматах.

1

Решение

Я думаю, что вы используете неправильный путь (так как вы, кроме миллионов строк). Что бы вы ни делали, у вашей бутылочки будет недостаток индекса, или вы не сможете использовать индекс, если он доступен. Вы должны были правильно спроектировать свою колонку, а также
Я нахожу ваше требование: «При сохранении в базе данных телефонные номера должны быть сохранены в удобном для пользователя формате». абсурдным. Каждая монета имеет две стороны, вы не можете рассматривать только одну сторону и игнорировать другую сторону. В вашем случае проще сохранять и отображать данные, но поиск по тем же данным практически невозможен.

Вам нужно будет найти золотую середину, которая будет диктовать вам, как сохранить данные, но ускорит поиск. Поскольку у вас уже есть столбец (который вы используете для хранения и отображения номера телефона), я бы предложил добавить еще один столбец «formattedphonenumbers» в качестве varchar. он должен хранить тот же номер телефона, но в правильном формате, который можно использовать в качестве индекса. В этом столбце удалите все символы, которые не являются числами, а затем поменяйте местами.

Например, если номер телефона + (91) 950-232-9020, то в форматированном столбце он должен быть сохранен как 020923205919 (в обратном порядке), теперь вы сможете правильно использовать индекс. При поиске, например, 950-232-9020 или + (91) 950-232-9020 или 0950-232-9020, сделайте то же самое, уберите все, а не цифры, поверните его и выполните поиск как
где отформатированный номер, например «020923205919%», если код страны не был указан, также будет доступен для поиска.

0

Другие решения

Регулярные выражения ваших друзей:

$number="9502329020";

$regexp = "(0|.* )?".substr($number,0,3)."-?".substr($number,3,3)."-?".substr($number,6,4);

$subquery = "SELECT * FROM table WHERE phone REGEXP '$regexp' or mobile REGEXP '$regexp'";
0

@Criesto: Просто реализовано как:

Создание **new table 'filtered_phonenumbers'**
с двумя столбцамиrecordid‘ а также ‘phone_number

Он будет иметь несколько телефонных номеров для одной записи,
сохраняется после удаления всех специальных символов, таких как space,(,),+,-

Например. У меня есть запись с

recordid = '1' and
phone = +(91) 950-232-9020
mobile = 9502329020

Итак, сделали новую таблицу «Filter_phonenumbers»
где запись сохраняется как на телефоне, так и на мобильном в отфильтрованном виде следующим образом:

recordid    |   phone_number
1           |   919502329020
1           |   9502329020

Всякий раз, когда нужно найти номер телефона, его можно найти в этой новой таблице, тогда запись может быть обработана с помощью recordid

0
По вопросам рекламы [email protected]