Ответ 1
Вам нужна функция FIND_IN_SET
:
SELECT ... WHERE FIND_IN_SET('1', field)
У меня есть поле MySQL со ссылкой на другую таблицу, где идентификаторы сохраняются как разделенные запятой, например:
12,13,14,16
которые обозначают значения в другой таблице. Я знаю, что это очень плохо и неправильно, но это происходит сверху, и я не могу ничего с этим поделать. Теперь проблема состоит в том, что я хочу искать в этом поле запрос следующего вида:
SELECT ... WHERE field LIKE '%1%'
Теперь теперь очевидно, что почти все записи можно найти в этом примере Query, поскольку наиболее распространенные идентификаторы находятся в диапазоне 10-20. Моя идея состоит в поиске%, 1,% вместо этого, но это не работает для первого и последнего id в поле. Ist там что-то вроде внутренней замены или как я исправить это лучший способ?
Вам нужна функция FIND_IN_SET
:
SELECT ... WHERE FIND_IN_SET('1', field)
Помните, что 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.
Как говорили другие, Find_In_Set позволит вам написать запрос, но вам действительно нужно посмотреть на дизайн базы данных (и я знаю, что вы знаете это...)
Проблема с включением внешних ключей в список с разделителями, подобный этому, состоит в том, что вся точка внешнего ключа позволяет вам быстро найти информацию в другой таблице, используя индексы. Внедряя базу данных, как она звучит, у вас есть всевозможные проблемы:
Есть только один действительно приемлемый способ решения этого вопроса, который не стоит перед лицом проблемы в первую очередь.
Проведите беседу с теми, кто стоит на высоком уровне, и объясните проблемы с их решением, а затем объясните преимущества правильной работы.
Если они даже не обсудят этот вопрос, найдите работу с достойным работодателем, который ценит ваши взносы.
Martin.
FIND_IN_SET - ваш лучший выбор
SELECT ... WHERE FIND_IN_SET(1,field_name)
После прочтения этого вопроса Id хотел бы добавить, что если ваш список с разделителями-запятыми имеет пробелы, то есть (1, 2,3, 4), вам нужно будет удалить ведущие/конечные пробелы или использовать WHERE FIND_IN_SET (X, field) ИЛИ FIND_IN_SET ('X', field) ИЛИ FIND_IN_SET ('X', field)..... Просто подумал, что я поделюсь этим, так как я столкнулся с этой проблемой..... просто нужно создать эти базы данных в первый раз или они даст вам всевозможные проблемы.