2010-04-20 17 views
25

separato Ho una tabella come questa:mysql controllo se i numeri sono in un elenco separato da virgole

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

E vorrei verificare se 3 e 15 sono nelle blob numeri chiamati. E può vedere la %% COME non può essere utilizzato

remare Solo con ID 2 e tre scoulb essere selezionato ...

+0

possibile duplicato del [MySQL valori di query trovare in una stringa separato da virgole] (http://stackoverflow.com/questions/5033047/mysql-query-finding- values-in-a-comma-separated-string) –

risposta

37

Questo funziona anche:

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

utilizzando il IN esaminerà una virgola separati stringa di esempio. questi due

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

Info found on this page:

+1

Certo che lo fa, stupido! –

+0

si sentono male ad accettare la propria risposta poiché anche l'altra era giusta. Ma l'IN sembra più giusto di find_in_set, anche se funzionerebbe anche lui. – Tillebeck

+1

davvero utile !! – Dharmesh

30
Non

la più bella soluzione, ma funziona:

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 

Si noti che è il confronto delle stringhe , quindi potrebbe essere necessario trasmettere i parametri di input anche a char.

+0

Grazie per il tuo aiuto. Ho trovato una pagina con un exmaple per la ricerca di valori separati da virgola. L'ho postato come risposta. Indovina che la tua soluzione funzionerebbe bene anche – Tillebeck

+0

L'unica soluzione che funziona per me. Grazie. –

+1

Questo ha funzionato per me, dove IN non ha funzionato. Ecco un esempio: seleziona l'id dagli utenti dove find_in_set (uid, (seleziona gli editor dagli articoli dove article_id = 123)) –

9

verificare anche se questo è utile a chiunque

Una funzione estesa per eliminare la limitazione del nativo FIND_IN_SET() in MySQL, questa nuova versione estesa FIND_IN_SET_X() fornisce funzionalità per confrontare una lista con un'altra lista.

cioè

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

Checkout this link for more details.

+1

Grazie per aver postato. Non sapevo che funzione – Tillebeck

+0

Qualcuno sa dove posso trovare i dettagli di questa funzione? Non riesco a trovare alcun riferimento ad esso e il collegamento non funziona più ... – Matthew

+0

Ho aggiornato il collegamento per indicare i documenti mysql. – Peter

9

si può provare come come seguire:

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

find_in_set_x

creare una nuova funzione in MySQL e incollare il seguente (non il mio lavoro tra l'altro)

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 funzione completa per voi

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 ; 
Problemi correlati