我有一个带有 2 个表的 MySQL 数据库:
表 A:
- 数字
- 地点
表 B:
- 调用代码
- 区号
- 地点
最初,我在表 A 中有大约 60,000 个条目,该表的开头位置列是空的。在表 BI 中有大约 250,000 多个条目,其中包含许多区号、呼叫代码 (1, 011) 及其各自在世界上的位置。我想要的是一种用数字位置填充表 A 的位置列的快速方法。
因此,例如,如果表 A 中的第一个条目是 (17324765600, null) 我想通过表 B 读取并获取该数字的位置。现在我通过这个查询得到一个号码的位置:
SELECT b.location
FROM
tableB b
LEFT JOIN tableA a
ON a.number LIKE CONCAT(b.calling_code, b.code, '%')
ORDER BY CHAR_LENGTH(b.code) DESC
LIMIT 1;
这给了我正确的位置(即使我怀疑它会失败..)。问题在于性能方面,这种方法是行不通的。如果我遍历所有 50k 数字
更新 1
请允许我放一些带有预期输出的示例数据:示例表 A:
号码位置 17324765600 空 01134933638950 空 0114008203800 空 …60k 记录 + 目前..
样品表 B:
call_code 代码位置 1 7324765 美国-新泽西 011 34933 西班牙 011 400820 中国 …目前有 250,000 多条记录
处理后的预期输出:表A:
号码位置 17324765600 美国-新泽西 01134933638950西班牙 0114008203800 中国
我想出的最好的是以下更新声明:
UPDATE tableA a JOIN tableB b ON a.location LIKE CONCAT(b.calling_code, b.code, '%') SET a.location = b.location
当然,在这里我不确定它是否总是返回代码的最长前缀,例如,如果在上表中有另一个以 73247XX 开头的代码,假设代码是针对爱荷华州的(仅作为示例)。我是不确定查询是否总是返回最长的代码,所以在这里我也需要帮助。
让我知道样品是否有帮助。
.SQL 用于数据库结构: 下载
更新 2:
我正在考虑通过以下方式执行此操作:
在将数据插入表 AI 之前,我正在考虑将表 B 导出到 CSV 并按区号对其进行排序,这样我可以有 2 个指针,一个用于表 A 的条目数组,一个用于 csv,均按区号排序这样我就可以进行一种并行搜索并在 PHP 上填充条目的位置,而不必在 MySQL 中执行此操作。
让我知道这种方法是否是一个更好的选择,如果是的话,我会对其进行测试并发布答案。