Mysql
 sql >> Database >  >> RDS >> Mysql

Alternativa alla clausola LIKE in 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

comunque faresti meglio a rifattorizzare il tuo schema aggiungendo una tabella di categoria e il riferimento ad essa nella tabella del prodotto (principale)

MODIFICA

un altro modo per affrontare questo problema è usare REGEXP che porterà a un WHERE più breve clausola (ecco cosa ho usato per testare):

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;

questo corrisponderà al tuo prod_catg contro l'espressione regolare '^1,.*|.*,1$|.*,1,.*' restituendo 1 (TRUE) se corrisponde, 0 (FALSE) altrimenti.

Quindi la tua clausola WHERE sarà simile a:

WHERE prod_catg REGEXP '^1,.*|.*,1$|.*,1,.*'

spiegazione dell'espressione regolare:

^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

sono sicuro che questa espressione regolare potrebbe essere molto più compatta ma non sono così bravo con le espressioni regolari

ovviamente puoi cambiare la categoria che stai cercando nell'espressione regolare (prova a sostituire 1 con 7 nell'esempio sopra)