在MySQL数据库表中搜索具有不同格式电话号码的两个或多个电话字段列中的电话号码
我有一个带有2 columns - phone and mobile.的数据库表
两列都有不同格式的电话号码,如下所示:
+(91) 950-232-9020
+91 950-232-9020
+91 9502329020
09502329020如果我想搜索电话号码'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查询中使用regex。
注意:在数据库中保存时,电话号码以用户友好的格式保存。
发布于 2015-09-04 06:20:29
我认为你使用错误的方式(因为你除了数百万行)。无论你做什么,你的瓶颈将是缺乏索引,否则你将无法使用索引,如果也可用。您应该正确地设计您的专栏,我还发现您的要求是:“在数据库中保存电话号码时,要以用户友好的格式保存。”荒谬可笑。每一枚硬币都有两面,你不能只考虑一面而忽略另一面。在您的示例中,保存和显示数据更容易,但搜索相同的数据几乎是不可能的。
您将不得不找到一个中间地带,这将指示您如何保存数据,但将使搜索更快。由于您已经有了一个列(用于存储和显示电话号码),我建议添加另一列“formattedphonenumbers”作为varchar。它应该存储相同的电话号码,但以适当的格式,可以用作索引。在本列中,删除所有不是数字的字符,然后将其反转。
如果电话号码是+(91) 950-232-9020,那么在格式化的列中,它应该被存储为020923205919(反向),现在您将能够正确地使用索引。在搜索(如950-232-9020或+(91) 950-232-9020或0950-232-9020 )时,做同样的事情--条条-所有非数字字符-将其反转并搜索为“020923205919%”格式的数字-如果没有给出国家代码,那么它也可以搜索。
发布于 2015-09-04 06:26:50
正则表达式是您的朋友:
$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'";发布于 2015-09-04 07:08:32
@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每当要搜索电话号码时,都可以在这个新表中搜索,然后记录就可以由记录器操作。
https://stackoverflow.com/questions/32390972
复制相似问题