Сортировать почтовый индекс для меню / списка - PullRequest
1 голос
/ 27 апреля 2009

Мне нужно отсортировать список почтовых индексов Великобритании для заказа.

Есть ли простой способ сделать это?

Почтовые индексы Великобритании состоят из букв и цифр:

см. Полную информацию о формате: http://en.wikipedia.org/wiki/UK_postcodes

Но моя проблема в том, что простая альфа-сортировка не работает, потому что каждый код начинается с 1 или 2 букв, а затем сразу следует число, до двух цифр, затем пробел, другое число, а не буква. например LS1 1AA или ls28 1AA, есть еще один случай, когда число в первом разделе превышает 99, затем оно продолжает 9A и т. Д.

Альфа-сортировка заставляет десятки сразу следовать за 1:

...
LS1 9ZZ
LS10 1AA
...
LS2 

Я смотрю на создание функции SQL для преобразования печатного почтового индекса в сортируемый почтовый индекс, например. «LS1 9ZZ» станет «LS01 9ZZ», затем используйте эту функцию в порядке упорядочения.

Кто-нибудь уже делал это или что-нибудь подобное?

Ответы [ 3 ]

4 голосов
/ 27 апреля 2009

Вы должны думать об этом как о проблеме токенизации, поэтому SW1A 1AA должен токенизироваться на:

  • SW
  • 1
  • A
  • 1AA

(хотя вы можете разбить внутреннюю часть на 1 и АА, если хотите)

и G12 8QT должны токенизироваться на:

  • G
  • 12
  • (пустая строка)
  • 8QT

Как только вы разбили почтовый индекс на эти составные части, сортировка должна быть достаточно простой. Исключение составляет почтовый индекс GIR 0AA, но вы можете просто жестко закодировать тест для этого

edit: еще несколько мыслей о токенизации

Для примера почтового индекса SW1A 1AA, SW - это область почтового индекса, 1A - это район почтового индекса (который будет разбит на две части для сортировки), 1 - сектор почтового индекса, а AA - почтовый индекс единицы.

Это действительные форматы почтовых индексов (источник: руководство пользователя Royal Mail PAF, стр. 8 - ссылка внизу этой страницы ):

АН НАА
ААН НАА
ANN NAA
АНА НАА
AAA NAA (только для кода GIR 0AA)
АНН НАА
ААНА НАА

Таким образом, будет грубый алгоритм (при условии, что мы хотим разделить почтовый индекс сектора и единицы):

  • код = GIR 0AA? Токенизируйте в GI / R / / 0 / AA (рассматривая R как район, упрощающий вещи)
  • код 5 букв длиной, например, G1 3AF? Токенизировать в G / 1 / / 3 / AF
  • код из 6 букв, 3-й символ - например, буква W1P 1HQ? Токенизируйте в W / 1 / P / 1 / HQ
  • код из 6 букв, 2-й символ - например, буква CR2 6XH? Токенизируйте в CR / 2 / / 6 / XH
  • код из 7 букв, 4-й символ, например, буква. EC1A 1BB? Токенизировать в EC / 1 / A / 1 / BB
  • в противном случае, например TW14 2ZZ, токенизация в TW / 14 / / 2 / ZZ

Если цель состоит в том, чтобы отобразить список почтовых индексов для выбора пользователя, я бы принял предложение Нила Баттерворта о сохранении «сортируемой» версии почтового индекса в базе данных. Самый простой способ создать сортируемую версию - это добавить все записи до девяти символов:

  • два символа для области (правая клавиша, если короче)
  • два для номера района (левый край, если короче)
  • один для окружного письма (прокладка, если отсутствует)
  • пространство
  • один для сектора
  • два за единицу

и GIR 0AA снова небольшое исключение. Если вы добавляете пробелы, порядок сортировки должен быть правильным. Примеры использования # для представления пробела:

  • W1 # 1AA => W ## 1 ## 1AA
  • WC1 # 1AA => WC # 1 ## 1AA
  • W10 # 1AA => W # 10 ## 1AA
  • W1W # 1AA => W ## 1W # 1AA
  • GIR # 0AA => GI # R ## 0AA
  • WC10 # 1AA => WC10 ## 1AA
  • WC1W # 1AA => WC # 1W # 1AA

Вам нужно заполнить область правой кнопкой, если она слишком короткая: заполнение влево дает неправильный порядок сортировки. Все однобуквенные области - B, E, G, L, M, N, S, W - будут отсортированы перед всеми двухбуквенными областями - AB, AL, ..., ZE - если вы добавите их слева

Номер района должен быть дополнен слева, чтобы гарантировать, что естественный порядок W1, W2, ..., W9, W10 остается неизменным

2 голосов
/ 24 сентября 2012

Я знаю, что это на пару лет позже, но я тоже только что столкнулся с этой проблемой. Мне удалось переписать его с помощью следующего кода, поэтому я решил поделиться им, когда искал в Интернете и ничего не смог найти!

mysql_query("SELECT SUBSTRING_INDEX(postcode,' ',1) as p1, SUBSTRING_INDEX(postcode,' ',-1) as p2 from `table` ORDER BY LENGTH(p1), p1, p2 ASC");

Этот код использует полный почтовый индекс Великобритании и делит его на 2.

Затем он будет упорядочен по первой части почтового индекса, за которой следует вторая.

1 голос
/ 27 апреля 2009

У меня будет соблазн сохранить нормализованный почтовый индекс в базе данных вместе с реальным почтовым индексом - таким образом, вы будете выполнять строковые манипуляции только один раз, и вы можете использовать индекс, чтобы помочь вам в сортировке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...