Подтвердить что ты не робот

Поиск MySQL в запятой

У меня есть поле MySQL со ссылкой на другую таблицу, где идентификаторы сохраняются как разделенные запятой, например:

12,13,14,16

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

SELECT ... WHERE field LIKE '%1%'

Теперь теперь очевидно, что почти все записи можно найти в этом примере Query, поскольку наиболее распространенные идентификаторы находятся в диапазоне 10-20. Моя идея состоит в поиске%, 1,% вместо этого, но это не работает для первого и последнего id в поле. Ist там что-то вроде внутренней замены или как я исправить это лучший способ?

4b9b3361

Ответ 1

Вам нужна функция FIND_IN_SET:

SELECT ... WHERE FIND_IN_SET('1', field)

Ответ 2

Помните, что plain FIND_IN_SET нечувствителен к регистру,

то есть. FIND_IN_SET('b3','a1,a2,B3,b3') и FIND_IN_SET('b3','a1,a2,B3,b3') оба возвращаются 3.

Чтобы быть чувствительным к регистру, добавьте модификатор 'binary' к 1-му аргументу, например. FIND_IN_SET (binary 'b3', 'a1,a2,B3,b3') возвращает 4.

Ответ 3

Как говорили другие, Find_In_Set позволит вам написать запрос, но вам действительно нужно посмотреть на дизайн базы данных (и я знаю, что вы знаете это...)

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

  • Как предотвратить дублирование (что будет пустым пространством)
  • Как удалить заданное значение (Требуется пользовательская функция, приводящая к возможности ошибок?
  • Как мне реагировать на проблемы с производительностью при увеличении размера моих таблиц?

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

Проведите беседу с теми, кто стоит на высоком уровне, и объясните проблемы с их решением, а затем объясните преимущества правильной работы.

Если они даже не обсудят этот вопрос, найдите работу с достойным работодателем, который ценит ваши взносы.

Martin.

Ответ 4

FIND_IN_SET - ваш лучший выбор

 SELECT ... WHERE FIND_IN_SET(1,field_name)

Ответ 5

После прочтения этого вопроса Id хотел бы добавить, что если ваш список с разделителями-запятыми имеет пробелы, то есть (1, 2,3, 4), вам нужно будет удалить ведущие/конечные пробелы или использовать WHERE FIND_IN_SET (X, field) ИЛИ FIND_IN_SET ('X', field) ИЛИ FIND_IN_SET ('X', field)..... Просто подумал, что я поделюсь этим, так как я столкнулся с этой проблемой..... просто нужно создать эти базы данных в первый раз или они даст вам всевозможные проблемы.