我正在为UN / LOCODE系统制作代码生成脚本,并且数据库在每个国家/地区都有唯一的3个字母/数字代码。因此,例如,数据库包含“EE TLL”,EE是国家(爱沙尼亚),TLL是爱沙尼亚境内的唯一代码,“AR TLL”也可以存在(国家代码和3个字母/数字代码分开存储)。代码用大写字母表示。
数据库相当大,已经包含大量的位置,用户也可以自己输入3个字母/数字(在自动提交之前将对数据库进行检查)。
最后,不能使用0或1(可能与O和I混淆)。
我正在搜索的是在没有提供的情况下选择下一个可用代码的最有效方法。
我想出了什么:
我会用AAA检查直到999,但是对于每个代码,它都需要一个新的查询(慢?)。
我可以将所有40000种可能性存储在一个数组中并减去已经存在于数据库中的所有已使用的代码......但是它使用了太多的内存IMO(实际上我不确定我在说什么,也许40000不是那么大的数字。)
生成一个随机代码并希望它现在还不存在,看看是否存在,如果它确实重新开始。这只是冒险。
是否有一些神奇的MySQL查询/ PHP脚本可以为我提供下一个可用的代码?
答案 0 :(得分:0)
我将使用数字2,它很简单,40000不是一个大数字。
为了提高效率,您可以存储一个代表每个3个字母代码的数字。转换应该是微不足道的,因为你总共有34个(A-Z,2-9)字母。
答案 1 :(得分:0)
我会选择1(即进行顺序搜索),添加一个表格,该表格给出了每个国家最后分配的代码(即,所有AAA ..代码都已分配)。通过顺序扫描分配新代码时,该表会更新;对于用户指定的代码,它保持不变。
如果您不想发出重复查询,也可以将此扫描内容写为stored routine。
为了简化迭代,最好将三字母代码视为数字(如Shawn Hsiao建议的那样),即赋予A-Z = 0..25和2..9 = 26..33的含义。然后,XYZ是数字X*34^2+Y*34+Z
== 23*1156+24*34+25
== 27429.这应该可以使用标准的MySQL函数,特别是使用CONV。
答案 2 :(得分:0)
我选择了第二个选项。我还能够创建一个脚本,尽可能地匹配国家名称,例如对于Tartu,它将尝试匹配T **然后TA *并且如果可能的话TAR,如果不是,它将尝试TAT,因为T是在塔尔图的R之后的下一个字母。
代码非常广泛,我只是发布第一个代码的部分:
$allowed = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ23456789';
$length = strlen($allowed);
$codes = array();
// store all possibilities in a huge array
for($i=0;$i<$length;$i++)
for($j=0;$j<$length;$j++)
for($k=0;$k<$length;$k++)
$codes[] = substr($allowed, $i, 1).substr($allowed, $j, 1).substr($allowed, $k, 1);
$used = array();
$query = mysql_query("SELECT code FROM location WHERE country = '$country'");
while ($result = mysql_fetch_array($query))
$used[] = $result['code'];
$remaining = array_diff($codes, $used);
$code = $remaining[0];
感谢您的意见,这将成为全球传输代码的关键:)