Em primeiro lugar, usar valores separados por vírgulas em um campo é problemático e você deve considerar armazená-los em uma tabela separada. Então você pode obter o registro de forma mais eficiente:
select ...
from mainTable t
inner join valueTable v1 on v1.id = t.id and v1.value = 1
inner join valueTable v2 on v2.id = t.id and v2.value = 2
inner join valueTable v3 on v3.id = t.id and v3.value = 3
Se isso não for possível, você deve seguir o caminho lento de correspondência de strings. Para corresponder os valores em uma string separada por vírgulas, você pode usar o
like
operador:... where
concat(',', someField, ',') like '%,1,%' and
concat(',', someField, ',') like '%,2,%' and
concat(',', someField, ',') like '%,3,%'
Colocar o separador em ambos os lados do valor pesquisado garante que você não obtenha nenhum falso positivo. Adicionar as vírgulas antes e depois do valor do campo garante que você possa encontrar o primeiro e o último valor.