我有世界上最简单的表格,用于查找英国邮政编码的 lat/lng 值(加载了完整的英国邮政编码数据):
CREATE TABLE postcodes (
postcode char(7) NOT NULL,
lat double(10,6) NOT NULL,
lng double(10,6) NOT NULL,
KEY postcode (postcode)
)
“邮政编码”字段中的邮政编码要么在前半部分末尾有 2 位数字,要么是一个数字,然后是一个空格。我认为空间对于它们如何匹配(??)的完整性很重要,此外我不想删除表格中的空格,因为我还拉出邮政编码用于显示目的(我不'不想要一个重复的字段,因为我很挑剔!)。例子:
'LE115AF', 'BS6 5EE', 'W1A 1AA', 'BS216RS', 'M3 1NH'
所以,有些有空格,有些没有。大多数是 7 个字符,有些只有 6 个。
无论如何,重点是我希望用户能够输入邮政编码查询,包括部分邮政编码,带或不带空格,并且如果他们的输入字符串有效(即他们不输入完整或部分邮政编码,则总能找到匹配项) '不存在于表中)。
到目前为止,这就是我所做的(在 PHP 的帮助下):
{...} WHERE `postcode` LIKE '" . str_replace(' ','%',$query) . "%' LIMIT 1
这有利于:
- 数据库中不包含空格的完整邮政编码
- 部分邮政编码,如果已输入空格并且在 db 中有相应的空格,或者查询的部分在空格出现的位置附近停止(例如,'W1A' 将匹配 'W1A 1AA','M3 1' 将匹配 'M3 1AR' ', ETC)。
但不适用于这些查询:
- 'W1A1AA' 应该匹配 'W1A 1AA'
- “BS65EE”应匹配“BS6 5EE”
- 'BS65' 应该匹配 db 中的第一个 'BS6 5%' 邮政编码,即 'BS6 5AA'
- 'M31' 应该同样匹配 'M3 1AR'
我猜我需要以某种方式做一些 MySQL 字符串函数魔术来确定行的邮政编码字段中是否有空格,并相应地调整我的 WHERE 子句逻辑?有人对最佳方法有任何建议吗?理想情况下,我还想:
- 避免 MySQL 存储过程(首选内联函数)
- 在 PHP 部分也只做内联字符串函数