2013-09-30 5 views
0

У меня есть Store таблицу, содержащую deliveryPostcodes поле, которое разделенный запятыми список областей почтовый индекс:Как сопоставить префиксы в списке, разделенном запятой?

id deliveryPostcodes 
1  EC1,EC2,N1 
2  EC1,WC1,WC2 
3  N1,N2 

Я хотел бы запросить эту таблицу для магазинов, соответствующих почтовый индекс, например, если пользователь вводит EC2A 9XY, он должен возвращать первую строку, так как у нее есть запись в списке, которая является префиксом полного почтового индекса.

Есть ли решение для этого без специальной функции?

Примечание: Я знаю, что мог бы сделать это, присоединившись к отдельной таблице с одной почтовым индексом на строку, но сейчас я изучаю различные варианты.

+2

Ваша БД выглядит потрепанной. Начните думать, чтобы скоро изменить его. –

+2

Хитрость - никогда не использовать списки, разделенные запятыми. Прочитайте о нормализации базы данных. – fancyPants

+0

Спасибо за комментарии ребята, я ожидал их, как вы можете видеть в моей заметке нижнего колонтитула. Все еще любопытно исследовать различные решения. – Benjamin

ответ

0

Не совсем ответ, но единственное правильное решение этой проблемы: нормализовать данные и поместить их в отдельную таблицу. Так как ваше решение:

  1. плохо для индексации
  2. плохо для поиска
  3. решения этого с регулярным выражением будет иметь массивную производительность удар
  4. такого рода структура будет вызывать проблемы, как только ваша база данных начинает расти.

Таблица поиска с почтовыми индексами также может пригодиться позже. Список почтовых индексов страны (или континентов), которые вы хотите, можно легко найти в Google, возможно, даже в формате, который вы можете импортировать в MySQL с минимальной работой.

+0

На самом деле я думаю * это * ответ, хотя сначала я не хотел его рассматривать, потому что я хотел сосредоточиться, вне интереса, на разделенном запятой решении. Но реакция каждого заставила меня понять, что нет дебатов! – Benjamin

+0

Когда вы работаете над большим проектом, у которого нет нормальной нормализованной структуры базы данных, вы поймете, почему это важно :) Хотя денормализация иногда может быть обусловлена ​​эксплуатационными соображениями! Ничто не черно-белое ... – NDM

0

Предполагая, что DeliveryPostcodes являются числовыми значениями, вы можете попробовать использовать регулярное выражение, соответствующее этому.

SELECT * 
FROM Store 
WHERE deliveryPostcodes RLIKE '.*,?[0-9]+,?.*' 
+0

Но что бы я положил в 'RLIKE'? Мне нужно было бы выяснить все различные комбинации префиксов и выполнить их на 'W',' WC', 'WC2', ... Кроме того, если элемент является первым или последним в списке, их не будет запятые на одной стороне, поэтому регулярное выражение не сработает! – Benjamin

+0

'. *,?' В начале регулярного выражения должно соответствовать нулю или нескольким символам, за которыми следует ноль или одна запятая. Аналогично, ',?. *' Последовательность в конце для соответствия нулю или одной запятой, за которой следуют ноль или более символов. – Litmus

+0

Вы действительно прав. Но это также будет соответствовать почти ** любой ** строке: вы можете очень хорошо удалить ',?', И результат будет таким же. – Benjamin

Смежные вопросы