Ваша строка является одним значением, а не несколькими значениями. В нем содержатся запятые, но это все еще одна строка.
Значение строки в числовом контексте берется из первых цифр номера. Другими словами, числовое значение «123 456 789» равно 123. MySQL игнорирует все символы после первого нецифрового числа. (Это поведение в MySQL, другие базы данных могут вести себя по-разному).
Предикат IN( )
позволяет сравнивать с несколькими значениями, но вы должны сделать их отдельными выражениями SQL. Например, в следующих двух запросах только первый возвращает что-либо:
SELECT * FROM partner WHERE 5 IN ( 1, 2, 3, 4, 5 );
SELECT * FROM partner WHERE 5 IN ( '1,2,3,4,5' );
Это показывает одну из многих причин, почему вы не должны использовать строку с разделенными запятыми элементами и ожидать, что она будет вести себя так, как будто это действительно набор отдельных значений.
Лучшим вариантом в этом случае является сохранение состояний для данного партнера в другой таблице, где каждая связь между партнером и состоянием находится в отдельной строке.
create table partner_states (
id_partner int not null,
id_state int not null,
primary key (id_partner, id_state)
);
Затем заполните его:
insert into partner_states (id_partner, id_state)
values (1, 8), (1, 9), (1, 10);
Затем вы можете легко запросить партнеров, которые соответствуют определенному состоянию:
select id_partner, name, states
from partner p join partner_states s on p.id_partner = s.id_partner
where s.id_state = 8
Запрос о партнерах, которые не соответствуют состоянию, которое вы можете сделать с внешним соединением:
select id_partner, name, states
from partner p left outer join partner_states s on p.id_partner = s.id_partner
and s.id_state = 8
where s.id_state is null