MySQL find_in_set con múltiples cadenas de búsqueda

Encuentro que find_in_set solo busca por una sola cadena: –

find_in_set('a', 'a,b,c,d') 

En el ejemplo anterior, ‘a’ es la única cadena utilizada para la búsqueda.

¿Hay alguna forma de utilizar el tipo de funcionalidad find_in_set y buscar por varias cadenas, como: –

 find_in_set('a,b,c', 'a,b,c,d') 

En el ejemplo anterior, quiero buscar por tres cadenas ‘a, b, c’.

Una forma en que veo es usar O

 find_in_set('a', 'a,b,c,d') OR find_in_set('b', 'a,b,c,d') OR find_in_set('b', 'a,b,c,d') 

¿Hay alguna otra manera que esto?

no hay una función nativa para hacerlo, pero puedes lograr tu objective usando el siguiente truco

 WHERE CONCAT(",", `setcolumn`, ",") REGEXP ",(val1|val2|val3)," 

La función MySQL find_in_set() puede buscar solo una cadena en un conjunto de cadenas.

El primer argumento es una cadena, por lo que no hay forma de que analice su cadena separada por comas en cadenas (¡no puede utilizar comas en elementos SET en absoluto!). El segundo argumento es un SET, que a su vez está representado por una secuencia separada por comas, de ahí su deseo de find_in_set('a,b,c', 'a,b,c,d') que funciona bien, pero seguramente puede ‘ t encuentra una cadena 'a,b,c' en cualquier SET por definición; contiene comas.

También puedes usar esta función personalizada

 CREATE FUNCTION SPLIT_STR( x VARCHAR(255), delim VARCHAR(12), pos INT ) RETURNS VARCHAR(255) RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), delim, ''); DELIMITER $$ CREATE FUNCTION `FIND_SET_EQUALS`(`s1` VARCHAR(200), `s2` VARCHAR(200)) RETURNS TINYINT(1) LANGUAGE SQL BEGIN DECLARE a INT Default 0 ; DECLARE isEquals TINYINT(1) Default 0 ; DECLARE str VARCHAR(255); IF s1 IS NOT NULL AND s2 IS NOT NULL THEN simple_loop: LOOP SET a=a+1; SET str= SPLIT_STR(s2,",",a); IF str='' THEN LEAVE simple_loop; END IF; #Do check is in set IF FIND_IN_SET(str, s1)=0 THEN SET isEquals=0; LEAVE simple_loop; END IF; SET isEquals=1; END LOOP simple_loop; END IF; RETURN isEquals; END; $$ DELIMITER ; SELECT FIND_SET_EQUALS('a,c,b', 'a,b,c')- 1 SELECT FIND_SET_EQUALS('a,c', 'a,b,c')- 0 SELECT FIND_SET_EQUALS(null, 'a,b,c')- 0 

También puede usar el comando like, por ejemplo:

 where setcolumn like '%a,b%' 

o

 where 'a,b,c,d' like '%b,c%' 

que podría funcionar en algunas situaciones.

puede usar in para encontrar valores de coincidencia de dos valores

 SELECT * FROM table WHERE myvals in (a,b,c,d)