2010-04-20 12 views
25

Mam tabeli tak:mysql sprawdzić, czy numery są oddzielone przecinkami listę

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

I chciałbym sprawdzić, czy 3 i 15 są w Blob numerów. I można zobaczyć JAK %% nie może być stosowany

row Tylko z ID 2 i trzech scoulb być wybrany ...

+0

możliwe duplikat [zapytania znalezienie wartości ciąg postaci łańcucha oddzielonych] (http://stackoverflow.com/questions/5033047/mysql-query-finding- wartości-in-a-comma-separated-string) –

Odpowiedz

37

Ten działa również:

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

pomocą IN przeanalizuje oddzielone przecinkami ciąg np. te dwa

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

Info found on this page:

+1

Oczywiście, że tak, głupi mnie! –

+0

źle się czuje przy przyjmowaniu własnej odpowiedzi, ponieważ druga strona też miała rację. Ale IN wydaje się być bardziej poprawne niż find_in_set, chociaż to też by działało. – Tillebeck

+1

naprawdę pomocne! – Dharmesh

30

Nie najbardziej całkiem rozwiązanie, ale działa:

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 

Należy pamiętać, że Jest to porównanie ciągów, więc może zajść potrzeba również, aby parametry wejściowe były przesyłane również do postaci char.

+0

Dzięki za pomoc. Znalazłem stronę z przykładami do przeglądania wartości oddzielonych przecinkami. Wysłałem to jako odpowiedź. Zgadnij, że twoje rozwiązanie też działa dobrze – Tillebeck

+0

Jedyne rozwiązanie, które działa dla mnie. Dzięki. –

+1

To działało dla mnie tam, gdzie IN nie. Oto przykład: wybierz identyfikator od użytkowników, gdzie find_in_set (uid, (wybierz redaktorów z artykułów, gdzie article_id = 123)) –

9

Należy również sprawdzić, czy jest to pomocne każdemu

rozszerzoną funkcją wyeliminować ograniczenia rodzimej FIND_IN_SET() w MySQL, ta nowa wersja rozszerzona FIND_IN_SET_X() zapewnia funkcję, aby porównać jedną listę z inną listą.

tj

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

Checkout this link for more details.

+1

Dzięki za wysyłkę. Nie znałem tej funkcji – Tillebeck

+0

Ktoś wie, gdzie mogę znaleźć szczegóły tej funkcji? Nie mogę znaleźć żadnych odniesień do niego, a link już nie działa ... – Matthew

+0

Zaktualizowałem link, aby wskazać dokumenty mysql. – Peter

9

można spróbować jako takie jak następujące:

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

find_in_set_x

utworzyć nową funkcję w mysql i wklej w następujących (nie mój praca przy okazji)

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

Funkcja zakończeniu Ci

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 ; 
Powiązane problemy