Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Explode в MySQL запросе

#mysql


Как я понял, аналога Explode в MySQL нет. Но как быть с такими ситуациями? Есть набор
материалов в базе данных, каждый из которых имеет строковой параметр с перечисленными
значениями (11,12,35), и по этому параметру необходимо обеспечить поиск. Ну, вернее,
по его части. Например, 11.

Когда же дело доходит до поиска, например, по значению 1, то, как и следовало ожидать,
находятся все материалы, куда включено данное значение: 1, 11, 12, 21,... Как быть
в такой ситуации?

Заводить отдельную таблицу со значениями параметров и затем третью, связывающую их
"многие ко многим"? Но таких параметров много, причем, большинство из них ограничено
парой десятков значений, а некоторые - и вообще, двумя-тремя, то есть, заводить +2
таблицы для каждого из таких параметров было бы неприятно. Хотя, возможно, это и правильное
решение...

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


Ответы

Ответ 1



С подобными строками одна проблема - использование индексов для поиска невозможно. и любой поиск будет полностью перебирать всю таблицу. Вообще есть функция find_in_set, которая ищет значение в списке через запятую, но опять же полным перебором. или concat(',',filed,',') like '%,1,%'. Или вообще concat(',',filed,',') regexp ',(1|15|23),' для поиска любого из 3х перечисленных значений. Отдельная таблица для быстрого поиска - наиболее правильное решение, т.к. наверняка в ней вот те значения 1, 11, 21 будут foreign key из другой таблицы, то на них уже будет построен индекс и при поиске where field=1 будут отобраны только нужные записи и не будет полного перебора таблицы. Единственный случай, когда отдельная таблица замедляет работу - это выборка всех значений для конкретной записи. Считать одну строку и сразу показать - конечно быстрее. При частых выборках возможно есть смысл внести избыточность и хранить обоими способами.

Комментариев нет:

Отправить комментарий