Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Alternativa à cláusula LIKE no Mysql

prod_catg LIKE '1,%' --matches when 1 is the first category
OR prod_catg LIKE '%,1,%' --matches when 1 is somewhere in the middle
OR prod_catg LIKE '%,1' --matches 1 when is the last category

de qualquer forma, é melhor refatorar seu esquema adicionando uma tabela de categorias e a referência a ela na tabela do produto (principal)

EDITAR

outra maneira de enfrentar esse problema é usar o REGEXP que levará a um WHERE mais curto cláusula (aqui está o que eu usei para testar):
DECLARE @regexp VARCHAR(100);
SET @regexp = '^1,.*|.*,1$|.*,1,.*';

SELECT
    '1,11,15,51,22,31' REGEXP @regexp AS test1,
    '51,11,15,1,22,31' REGEXP @regexp AS test2,
    '11,15,51,22,31,1' REGEXP @regexp AS test3,
    '7,11,15,51,22,31' REGEXP @regexp AS test4,
    '51,11,15,7,22,31' REGEXP @regexp AS test5,
    '11,15,51,22,31,7' REGEXP @regexp AS test6;

isso corresponderá ao seu prod_catg contra a expressão regular '^1,.*|.*,1$|.*,1,.*' returnig 1 (TRUE) se corresponder, 0 (FALSE) por outro lado.

Então sua cláusula WHERE ficará assim:
WHERE prod_catg REGEXP '^1,.*|.*,1$|.*,1,.*'

explicação do regexp:
^1,.* --matches 1 at the beginning of a string followed by a `,` and any other char
.*,1$ --matches 1 at the end of a string preceded by a `,` and any other char
.*,1,.* --matches 1 between two `,` which are sourrounded by any other chars
| --is the OR operator

tenho certeza que este regexp poderia ser muito mais compacto, mas não sou tão bom com expressões regulares

obviamente você pode alterar a categoria que está procurando na expressão regular (tente substituir 1 com 7 no exemplo acima)