Поиск номера телефона в таблице базы данных 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.
Примечание. При сохранении в базе данных телефонные номера сохраняются в удобных для пользователя форматах.
Я думаю, что вы используете неправильный путь (так как вы, кроме миллионов строк). Что бы вы ни делали, у вашей бутылочки будет недостаток индекса, или вы не сможете использовать индекс, если он доступен. Вы должны были правильно спроектировать свою колонку, а также
Я нахожу ваше требование: «При сохранении в базе данных телефонные номера должны быть сохранены в удобном для пользователя формате». абсурдным. Каждая монета имеет две стороны, вы не можете рассматривать только одну сторону и игнорировать другую сторону. В вашем случае проще сохранять и отображать данные, но поиск по тем же данным практически невозможен.
Вам нужно будет найти золотую середину, которая будет диктовать вам, как сохранить данные, но ускорит поиск. Поскольку у вас уже есть столбец (который вы используете для хранения и отображения номера телефона), я бы предложил добавить еще один столбец «formattedphonenumbers» в качестве varchar. он должен хранить тот же номер телефона, но в правильном формате, который можно использовать в качестве индекса. В этом столбце удалите все символы, которые не являются числами, а затем поменяйте местами.
Например, если номер телефона + (91) 950-232-9020, то в форматированном столбце он должен быть сохранен как 020923205919 (в обратном порядке), теперь вы сможете правильно использовать индекс. При поиске, например, 950-232-9020 или + (91) 950-232-9020 или 0950-232-9020, сделайте то же самое, уберите все, а не цифры, поверните его и выполните поиск как
где отформатированный номер, например «020923205919%», если код страны не был указан, также будет доступен для поиска.
Регулярные выражения ваших друзей:
$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'";
@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