Explode в MySQL запросе

268
28 ноября 2017, 20:03

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

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

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

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

Answer 1

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

Отдельная таблица для быстрого поиска - наиболее правильное решение, т.к. наверняка в ней вот те значения 1, 11, 21 будут foreign key из другой таблицы, то на них уже будет построен индекс и при поиске where field=1 будут отобраны только нужные записи и не будет полного перебора таблицы.

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

READ ALSO
Аналог запроса RedBean на PDO

Аналог запроса RedBean на PDO

Здравствуйте!!!

265
Эффективная точечная графика в UWP

Эффективная точечная графика в UWP

Какие есть контролы/библиотеки для отображения большого массива точек? Win2d пробовал, работает отвратительноНо проблема не в алгоритме, т

296
Плавное изменение текста Label

Плавное изменение текста Label

Необходимо сделать в главном окне в центре Label и чтобы каждые 2 секунды текст плавно сменялся другимТекст можно указать в массиве string[], сделать...

284
Сбой при входе в режим прерывания

Сбой при входе в режим прерывания

Вылезает при компиляции проектаИ из проекта исчезли все ссылки на форму

264