【问题标题】:Search multiple phone number formats via PHP from MySQL通过 PHP 从 MySQL 搜索多种电话号码格式
【发布时间】:2015-09-04 05:53:50
【问题描述】:

在 MySQL 数据库表中搜索电话号码,其中两个或多个电话字段列具有不同格式的电话号码

我有一个带有2 columns - phone and mobile.的数据库表

两列都有不同格式的电话号码,例如:

+(91) 950-232-9020  
+91 950-232-9020  
+91 9502329020  
09502329020

如果我想搜索电话号码“9502329020”,请从我的 PHP 脚本中,
我希望它返回 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 查询中使用正则表达式。

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 当使用这个时,我建议使用两列,一列采用正常格式,一列采用反向格式。如果您不使用或不阅读 sql 列 cmets,则反向列没有多大意义。
  • @Ratna - 如果国家代码不同,它会产生问题。
  • @Shivani Aggarwal 你能告诉我怎么做吗?您也可以尝试使用不同的国家/地区代码。
【解决方案2】:

正则表达式是你的朋友:

$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'";

【讨论】:

  • 他们仍然是你的朋友。慢的朋友。
  • “它很复杂”是什么意思?实施复杂?理解起来复杂吗?由于速度太慢而使其工作复杂吗?
  • @Amarnasan - 毫无疑问它有效,但需要很多时间。因为我有 3 个模块,每个模块中有 3-4 个电话字段,每个模块中有许多记录。传入的号码也不是同一类型。所以匹配一个电话号码需要时间,需要循环。所以目前,我做了一个 cron 作业,它将在幕后运行,并从电话号码中删除特殊字符并将号码与唯一记录 ID 一起保存在单独的表中。所以我只需要在一个没有循环的表中搜索。
【解决方案3】:

@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来操作记录

【讨论】:

    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多