从MySQL

时间:2015-09-04 05:53:50

标签: php mysql search multiple-columns phone-number

使用两个或多个具有不同格式电话号码的电话字段列搜索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查询中使用正则表达式。

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

3 个答案:

答案 0 :(得分:0)

我认为你使用了错误的方法(因为你除了数百万行)。无论你做什么,你的瓶颈都会缺乏索引,否则你也无法使用索引。您也应该正确设计列 我发现你的要求'保存在数据库中时,电话号码将以用户友好的格式保存。'荒诞。每个硬币都有两面,你不能只考虑一面而忽略另一面。在您的情况下,保存和显示数据更容易,但几乎不可能搜索相同的数据。

您必须找到一个中间位置,它将指示您如何保存数据,但会更快地进行搜索。由于您已经有一个列(用于存储和显示电话号码),我建议添加另一列' formattedphonenumbers'作为varchar。它应该存储相同的电话号码,但格式可以用作索引。在此列中删除所有非数字的字符,然后将其反转。

例如,如果电话号码是+(91)950-232-9020,那么在格式化列中它应该存储为020923205919(反向),现在您将能够正确使用索引。当搜索例如.950-232-9020或+(91)950-232-9020或0950-232-9020时,做同样的事情去除所有非数字字符反转它并搜索为 格式化的数字,如' 020923205919%'如果没有给出国家代码,那么它也可以搜索。

答案 1 :(得分: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'";

答案 2 :(得分:0)

@Criesto:刚刚实现为:

创建**new table 'filtered_phonenumbers'**
有两列“recordid”和“phone_number

单个记录会有多个电话号码,
剥离掉space,(,),+,-

等所有特殊字符后保存

EG。我有记录

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

于是制作了一张新表'filtered_phonenumbers' 其中记录以过滤形式同时保存在手机和手机中,如下所示:

recordid    |   phone_number
1           |   919502329020
1           |   9502329020

每当要搜索一个电话号码时,可以在这个新表中搜索,然后记录可以通过recordid进行操作