希望一个伟大的人能在这里帮助我。
我有一个情况,我将收到一个国际电话号码从供应商,我必须做一个数据库查找,并找出国家,地区,电话号码打电话类型。
例如,假设我将收到一个电话号码+393234567891。我得查一下那个电话号码所属国家的桌子。所以我知道'39'是意大利,我在数据库里有一个国家代码,但我必须确定这个号码是固定电话还是手机。为此,我需要更多的信息,从电话号码,所以'39'是一个固定电话和'393'是一个手机。我需要知道电话号码里有“393”,所以我知道这是一部手机。
我的问题是什么是最好的评估方法?会不会循环遍历电话号码的每个部分,比如首先将前两个电话号码与数据库进行比较,然后将前三个电话号码与前四个电话号码进行比较,直到返回一个结果?例如,如果我继续这个例子,并将意大利的'39'与db进行比较,我将返回一系列结果,因为有'39'和'393'以及'3939'等等。那么,使用整个电话号码获得与电话号码前缀完全匹配的最佳方法是什么?
我本想把电话号码循环一下,再在循环中加上一个数字,直到我只得到一个结果,我只想确保这是最有效的方法。
有什么建议吗?谢谢!

最佳答案

我想你的桌子是这样的:

prefix (id, number)

数据如下:
1, '39'
2, '393'
3, '33'
4, '331'

你可以得到最长的比赛与一个反向类似:
SELECT id
FROM prefix
WHERE "393234567891" LIKE CONCAT(number, "%")
ORDER BY LENGTH(number)
LIMIT 1;

我没有测试过,但是假设您的最短前缀是2个字符,您可能会得到一些改进(这将只检查以39开头的前缀,即您拥有的所有前缀的1%):
SELECT id
FROM prefix
WHERE "393234567891" LIKE CONCAT(number, "%")
    AND number LIKE "39%"
ORDER BY LENGTH(number)
LIMIT 1;

然后,您可以有一个附加了信息的不同表,其前缀如下:
prefixinfo (id, prefix_id, type, data)

数据如下:
1, 1, 'country', 'Italy'
2, 2, 'country', 'Italy'
3, 2, 'type',    'Landline'
4, 3, 'country', 'France'
5, 4, 'country', 'France'
6, 4, 'city',    'Paris'

10-07 20:39