Tout d'abord, l'utilisation de valeurs séparées par des virgules dans un champ est problématique, et vous devriez plutôt envisager de les stocker dans une table séparée. Vous pourriez alors obtenir l'enregistrement plus efficacement :
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
Si ce n'est pas possible, vous devez suivre la méthode de correspondance lente des chaînes. Pour faire correspondre les valeurs dans une chaîne séparée par des virgules, vous pouvez utiliser le like
opérateur :
... where
concat(',', someField, ',') like '%,1,%' and
concat(',', someField, ',') like '%,2,%' and
concat(',', someField, ',') like '%,3,%'
Placer le séparateur des deux côtés de la valeur recherchée garantit que vous n'obtenez pas de faux positifs. L'ajout de virgules avant et après la valeur du champ garantit que vous pouvez trouver la première et la dernière valeur.