У меня самая простая в мире таблица для поиска значений широты / долготы для почтового индекса Великобритании (загруженного полными данными почтового индекса Великобритании):
CREATE TABLE postcodes (
postcode char(7) NOT NULL,
lat double(10,6) NOT NULL,
lng double(10,6) NOT NULL,
KEY postcode (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» и т. Д.).
Но не работает для этих запросов:
- W1A1AA должно совпадать с W1A 1AA
- 'BS65EE' должно совпадать с 'BS6 5EE'
- 'BS65' должен соответствовать первому почтовому индексу 'BS6 5%' в дБ, то есть 'BS6 5AA'
- 'M31' должно совпадать с 'M3 1AR'
Полагаю, мне нужно как-то применить магию строковых функций MySQL, чтобы выяснить, есть ли пробел в поле почтового индекса строки, и соответствующим образом настроить логику предложения WHERE? Кто-нибудь получил какой-либо совет о лучшем подходе? Я в идеале хочу также:
- избегать хранимых процедур MySQL (предпочтительнее встроенные функции)
- тоже не делает ничего, кроме встроенных строковых функций в части PHP