使用两个或多个具有不同格式电话号码的电话字段列搜索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查询中使用正则表达式。
注意:保存在数据库中时,电话号码会以用户友好的格式保存。
答案 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进行操作