В основном у меня есть строка в моей таблице, которая имеет следующий формат для ее значения – 1,2,3,4,10,11,21,34
т. Д.
Я извлекаю значения с помощью инструкции LIKE, но поскольку я использую ее с %<value>%
, при поиске 1
она возвращает 11, 21, 1 и так далее.
Как я могу его ограничить, чтобы вернуть значения на основе одного?
Вместо col LIKE '%<value>%'
do
col LIKE '%,<value>,%' OR col LIKE '<value>,%' OR col LIKE '%,<value>' OR col LIKE '<value>'
или еще лучше
col REGEXP '(.+,|^)<val>(,.+|$)'
Но лучшим решением является изменение структуры данных! Используйте либо тип SET
, либо несколько полей, или таблицу соединений.
Попробуйте find_in_set()
строки find_in_set()
:
SELECT ... FROM ... WHERE FIND_IN_SET(somevalue, '1,2,3,4,10');
Обратите внимание, что это просто функция MySQL и недоступна нигде, не пробираясь через огромные обручи.
Если вы хотите вернуть только определенное совпадение, используйте вместо = LIKE. Как и для возврата частичных совпадений, в отличие от =, который возвращает только определенные совпадения. Если вы просто хотите сопоставить первую часть, используйте%, но 11 все равно вернет 111, но не 211. Общей ошибкой является использование LIKE для всего, ИЛИ удаление %% вокруг. Кроме того, вы действительно имеете в виду, что VALUE для строки в вашей базе данных MYSQL составляет 1,2,3,4,11,12 и т. Д.? И если да, то почему вы пытаетесь найти это значение на основе числа, которое в нем? Я бы подумал, что вы будете искать подмножество целого, например, 3,4,11% и т. Д. …
Хотя я согласен с другими ответами относительно изменения структуры данных, проблему, с которой вы сталкиваетесь, можно легко устранить, сохранив каждое значение в вашем поле последовательных данных, инкапсулированное с обеих сторон разделителем.
I don't recommend it
, но если вы изменили свои данные с 1,2,3,4,10,11,21,34
до ,1,2,3,4,10,11,21,34,
, вы будете обратите внимание, что каждое значение помечено с обеих сторон запятой, поэтому теперь вы можете искать %,<value>,%