Поиск элементов из разделенного символами текстового поля в MySQL - PullRequest
1 голос
/ 31 декабря 2011

Я создаю приложение на основе MySQL, которое позволяет пользователям искать некоторые объекты. Объекты хранятся в одном столбце TEXT и представлены в виде поля, разделенного «|». Вот пример:

1|2|3|5|6|10|11|12|13|15|17|18|20|21|27|29|30|31|3...

Есть ли у вас какие-либо идеи, как я могу реализовать эффективный поиск объектов в MySQL? Давайте предположим, что нам нужно извлечь все строки, которые «содержат» средства 1, 2 и 15, каким будет запрос / метод? Я пытался использовать полнотекстовые индексы, но безуспешно.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 31 декабря 2011

Нет способа найти разделенную символом строку для данного значения эффективно .

Лучший способ повысить эффективность в SQL - это использовать индексы, но вы не можете использовать индексы, чтобы помочь найти подстроки.

Лучший способ оптимизировать ваш сценарий - создать дочернюю таблицу с одним индексированным столбцом INT и сохранить каждое из ваших числовых значений в отдельной строке. Тогда вы можете эффективно выполнять поиск с помощью индекса.

См. Также мой ответ на Действительно ли плохо хранить список, разделенный запятыми, в столбце базы данных?

Что касается сопоставления нескольких объектов, когда они хранятся в отдельных строках, я добавил тег sql-match-all, который используется при переполнении стека для такого типа проблемы. Это часто встречается, и уже есть много хороших ответов. Нажмите на тег, чтобы найти их.

0 голосов
/ 31 декабря 2011

Вы можете использовать функцию FIND_IN_SET () . Однако это работает только для списков, разделенных запятыми, поэтому вам придется предварительно обработать поля:

SELECT ... WHERE FIND_IN_SET('something', STR_REPLACE(your_text_field, '|', ','));

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

...