2010-04-20 10 views
25

separados Tengo una tabla como la siguiente:cheque MySQL si los números están en una lista separada por comas

UID(int) NUMBERS(blob) 
---------------------- 
1  1,13,15,20 
2  3,10,15,20 
3  3,15 

Y me gustaría probar si 3 y 15 se encuentran en los números de llamada gota. Y se puede ver el %% COMO no se puede utilizar

Sólo remar con ID 2 y tres scoulb ser seleccionado ...

+0

posible duplicado de [encontrar valores de consulta de MySQL en una cadena separada por comas] (http://stackoverflow.com/questions/5033047/mysql-query-finding- values-in-a-comma-separated-string) –

Respuesta

37

Este también funciona:

SELECT * FROM table WHERE 3 IN (NUMBERS) AND 15 IN (NUMBERS) 

utilizando la EN se verá en una cadena separada por comas, por ejemplo. estos dos

WHERE banana IN ('apple', 'banana', 'coconut') 
WHERE 3 IN (2,3,6,8,90) 

Info found on this page:

+1

Por supuesto que sí, estúpido! –

+0

se siente mal por aceptar su propia respuesta ya que la otra también estaba en lo cierto. Pero el IN parece más correcto que el find_in_set, aunque eso también funcionaría. – Tillebeck

+1

realmente útil! – Dharmesh

30
No

la solución más bonito, pero funciona:

select 
    UID 
from 
    YOUR_TABLE 
where 
    find_in_set('3', cast(NUMBERS as char)) > 0 
    and 
    find_in_set('15', cast(NUMBERS as char)) > 0 

Tenga en cuenta que es comparación de cadena, por lo que es posible que también necesite convertir los parámetros de entrada en caracteres.

+0

Gracias por su ayuda. Encontré una página con un modelo para buscar valores separados por comas. Lo publiqué como una respuesta. Supongo que su solución también funcionaría bien – Tillebeck

+0

La única solución que funciona para mí. Gracias. –

+1

Esto funcionó para mí donde IN no lo hizo. Aquí está la muestra: seleccione id de usuarios donde find_in_set (uid, (seleccione editores de artículos donde article_id = 123)) –

9

también comprobar si esto es útil para cualquiera

una función ampliada para eliminar la limitación del nativa FIND_IN_SET() en MySQL, esta nueva versión extendida FIND_IN_SET_X() ofrece función para comparar una lista con otra lista.

es decir

mysql> SELECT FIND_IN_SET_X('x,c','a,b,c,d'); -> 3 

Checkout this link for more details.

+1

Gracias por publicar. No sabía esa función – Tillebeck

+0

¿Alguien sabe dónde puedo encontrar detalles de esta función? No puedo encontrar ninguna referencia y el enlace ya no funciona ... – Matthew

+0

He actualizado el enlace para que apunte a los documentos de mysql. – Peter

9

que puedes probar medida como seguir:

SELECT * FROM table_name WHERE FIND_IN_SET('3', NUMBERS) AND FIND_IN_SET('15', NUMBERS) 
0

find_in_set_x

crear una nueva función en MySQL y pegar en el siguiente (no es mi trabajo por cierto)

BEGIN 
DECLARE limitCount INT DEFAULT 0; 
DECLARE counter INT DEFAULT 0; 
DECLARE res INT DEFAULT 0; 
DECLARE temp TEXT; 
SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',','')); 
simple_loop:LOOP 
SET counter = counter + 1; 
SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList,',',counter),',',-1); 
SET res = FIND_IN_SET(temp,targetList); 
IF res > 0 THEN LEAVE simple_loop; END IF; 
IF counter = limitCount THEN LEAVE simple_loop; END IF; 
END LOOP simple_loop; 
RETURN res; 
END 
3

La función completa para usted

DELIMITER $$ 

CREATE FUNCTION `FIND_IN_SET_X`(inputList TEXT,targetList TEXT) RETURNS INT(11) 
    DETERMINISTIC 
BEGIN 
    DECLARE limitCount INT DEFAULT 0 ; 
    DECLARE counter INT DEFAULT 0 ; 
    DECLARE res INT DEFAULT 0 ; 
    DECLARE temp TEXT ; 
    SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',', '')) ; 
    simple_loop : 
    LOOP 
    SET counter = counter + 1 ; 
    SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList, ',', counter),',',- 1) ; 
    SET res = FIND_IN_SET(temp, targetList) ; 
    IF res > 0 
    THEN LEAVE simple_loop ; 
    END IF ; 
    IF counter = limitCount 
    THEN LEAVE simple_loop ; 
    END IF ; 
    END LOOP simple_loop ; 
    RETURN res ; 
END$$ 

DELIMITER ; 
Cuestiones relacionadas