有效地将电话号码前缀数据库与电话号码相匹配?

时间:2015-09-22 01:34:51

标签: php mysql database

我有一个充满电话号码前缀的数据库表,以及每个人每分钟花费多少钱。电话前缀的长度可能会有很大差异,从一位数到一位数(5-6或更多)。

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

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

有更好的方法吗?

更新:这是表格的截图,第一列是说明,第二列是通话费率,第三列是电话前缀。 Phone cost table

挑战在于将真实的电话号码(例如61412345678)与最适用的前缀相匹配,而无需像我当前的方法那样多的查询。

1 个答案:

答案 0 :(得分:2)

应该是一个基于最长前缀的订单的简单查询,并返回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个记录的限制将返回更通用的较短前缀。