通过PHP从MySQL搜索多个电话号码格式


Search multiple phone number formats via PHP from 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查询。

注意:在数据库中保存时,电话号码以用户友好的格式保存。

我认为你使用错误的方式(因为你除了数百万行)。无论你做什么,你的瓶颈将是缺乏索引,或者你将无法使用索引,如果有。您也应该正确地设计您的专栏在数据库中保存时,电话号码将以用户友好的格式保存。"荒谬。每个硬币都有两面,你不能只考虑一面而忽略另一面。在您的情况下,保存和显示数据比较容易,但是在相同的数据上进行搜索几乎是不可能的。

你必须找到一个中间地带,既能告诉你如何保存数据,又能使搜索更快。由于您已经有了一个列(用于存储和显示电话号码),我建议添加另一个列'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 

创建一个新表'filtered_phonenumbers'
其中记录以过滤后的形式同时保存电话和移动设备,如下所示:

recordid    |   phone_number
1           |   919502329020
1           |   9502329020

无论何时要搜索电话号码,都可以在这个新表中搜索,然后可以使用recordid

操作该记录。