使用两个或多个不同格式的电话字段列在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