У меня есть такая база данных (Mysql 5.6):

id | value
--------------------------
1  | "value1;value2;value3"
2  | "value4;value5;value6"

Я хочу сделать такой запрос:

SELECT id FROM table WHERE 'value5' IS IN value
return --> 2

SQLFiddle: http://sqlfiddle.com/#!9/b5c347

Я не могу изменить схему базы данных

1
IggY 29 Окт 2015 в 18:29

2 ответа

Лучший ответ

Используйте синтаксис LIKE, но так:

SELECT id
FROM table
WHERE
    value LIKE 'value5;%' OR
    value LIKE '%;value5' OR
    value LIKE '%;value5;%' OR
    value LIKE 'value5';

Это грязное решение, которое невозможно проиндексировать, но оно должно соответствовать вашим потребностям (на небольшой таблице за разумное время)

Другое решение (если вы уверены, что ваши значения не содержат запятых):

SELECT id
FROM table
WHERE
    FIND_IN_SET('value5', REPLACE(value, ';', ',')
1
Goodbye StackExchange 29 Окт 2015 в 15:43

Если все значения различаются, вы можете использовать LIKE:

SELECT id FROM table WHERE value LIKE '%value5%';

Просто имейте в виду, что это не сработает, если у вас есть какое-то значение, которое содержит другое, например

value2;value3;value56

Или используйте RegExp, например:

SELECT id FROM table WHERE value REGEXP '(^|[^a-z0-9])value5([^a-z0-9]|$)'
1
Piyin 29 Окт 2015 в 16:28