【问题标题】:Efficiently match a database of phone number prefixes to a phone number?有效地将电话号码前缀数据库与电话号码匹配?
【发布时间】:2015-09-22 01:34:51
【问题描述】:

我有一个数据库表,其中包含电话号码前缀以及每个电话号码每分钟的费用。电话前缀的长度可以变化很大,从一位数到很多位(5-6 或更多)。

一些前缀会重叠,例如通常有一个默认的国家/地区每分钟费率,因此更具体的移动费率必须覆盖不太具体的费率。

目前我正在考虑这样做的方式是做一个while循环检查前缀表中的数字,每个循环删除最后一个数字。这是非常准确的,但是它确实会进行很多查询,因为一个数字可能是 12 位长,而相关的前缀大约是 4 位。

有没有更好的办法?

更新:这是表格的截图,第一列是描述,第二列是通话费率,第三列是电话前缀。

挑战是将像 61412345678 这样的真实电话号码与最适用的前缀匹配,而不需要像我当前的方法那样多的查询。

【问题讨论】:

  • 你能再澄清一点吗,最好是截图或带有数据的表格结构?
  • 是的,确实得到了表格的屏幕截图。
  • 为什么不取一个子字符串并将其与带有前缀的列匹配...所以说您确实有 12 位数字,只需取其中的 4 位并匹配...获取对应的 ID 或其他列您需要与该行相关的数据以从那里继续处理...不知道为什么要从末尾循环遍历数字...
  • 好问题,我想说。你可以这样想: 1. 在一个while循环中,首先找到strlen(prefix)。例如,电话号码是 61412345678,第一个前缀是 61,所以我们会得到 strlen(61)=2 并将这个前缀与电话号码进行比较,如果匹配,我们会将 strlen 和前缀存储在数组 2 中。然后遍历下一个前缀并得到strlen(61870) =5,并将这个前缀与电话号码进行比较,如果匹配,我们会将strlen和前缀存储在数组3中。最后,从数组中找到max(strlen)。解决方案看起来效率不高,但您可以进一步改进!
  • BK435 这是因为前缀长度可以变化,并且可以重叠,所以它不能使用第一个匹配的前缀,它必须使用最具体的前缀。

标签: php mysql database


【解决方案1】:

应该是一个简单的查询,基于最长前缀的 order by 并返回 1 条记录的限制...类似...

select
      pp.*
   from
      phonePrefix pp
   where
      '61412345678' like pp.prefix + '%'
   order by
      length( trim( pp.prefix )) DESC
   limit 1

所以,您的电话号码将匹配

49 Australia at .0165 = "61" prefix length of prefix 2
62 Australia - Mobile at .075 = "614" prefix length of 3 <-- would be in first position and then limit 1 returns it instead of ID 49.

现在,如果电话号码像“6188319383” 将通过“61”返回#49 的值,通过“61883”返回#53 的值。

简单的查询,可能需要对其进行一些调整,但原则是准确的,而不是您拥有数字与字符的实际数据类型。

如果说你确实有前缀,也会发生类似情况

6
61
618
6188
61883

61883 的前缀长度为 5,按降序排列,1 条记录的限制将在更通用的较短前缀上返回它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多