2010-04-20 32 views
25

Tôi có một bảng như thế này:mysql kiểm tra nếu số đang ở trong một dấu phẩy tách ra danh sách

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

Và tôi muốn kiểm tra xem 3 và 15 đang trong blob gọi SỐ. Và có thể xem %% NHƯ không thể sử dụng

Chỉ chèo với ID 2 và ba scoulb được lựa chọn ...

+0

thể trùng lặp của [MySQL giá trị truy vấn tìm kiếm trong một dấu phẩy chuỗi tách ra] (http://stackoverflow.com/questions/5033047/mysql-query-finding- chuỗi giá trị trong một dấu phẩy-tách) –

Trả lời

37

Cái này cũng làm việc:

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

sử dụng IN sẽ nhìn vào một dấu phẩy tách chuỗi ví dụ. hai

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

Info found on this page:

+1

Tất nhiên là có, tôi ngu ngốc! –

+0

cảm thấy xấu về việc chấp nhận câu trả lời của riêng vì câu trả lời khác cũng đúng. Nhưng IN có vẻ đúng hơn find_in_set mặc dù điều đó cũng có tác dụng. – Tillebeck

+1

thực sự hữu ích !! – Dharmesh

30

Không phải là giải pháp khá nhất, nhưng nó hoạt động:

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 

Lưu ý rằng đó là so sánh chuỗi, vì vậy bạn cũng có thể cần phải nhập tham số đầu vào của mình vào char.

+0

Cảm ơn sự giúp đỡ của bạn. Tôi tìm thấy một trang với một exmaple cho việc tìm kiếm các giá trị được phân tách bằng dấu phẩy. Tôi đăng nó như một câu trả lời. Đoán giải pháp của bạn sẽ hoạt động tốt quá – Tillebeck

+0

Giải pháp duy nhất phù hợp với tôi. Cảm ơn. –

+1

Điều này làm việc cho tôi, nơi IN không. Đây là mẫu: chọn id từ người dùng nơi find_in_set (uid, (chọn người chỉnh sửa từ bài viết có article_id = 123)) –

9

Ngoài ra kiểm tra nếu điều này là hữu ích cho bất cứ ai

Một chức năng mở rộng để loại bỏ các hạn chế của bản địa FIND_IN_SET() trong MySQL, phiên bản này mở rộng mới FIND_IN_SET_X() cung cấp tính năng để so sánh một danh sách với một danh sách khác.

tức

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

Checkout this link for more details.

+1

Cảm ơn bạn đã đăng bài. Không biết rằng chức năng – Tillebeck

+0

Bất kỳ ai biết nơi tôi có thể tìm thấy chi tiết về chức năng này? Tôi không thể tìm thấy bất kỳ tham chiếu đến nó và liên kết không còn hoạt động ... – Matthew

+0

Tôi đã cập nhật liên kết để trỏ đến tài liệu mysql. – Peter

9

Bạn có thể thử Như Giống như sau:

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

find_in_set_x

tạo một hàm mới trong mysql và dán vào sau (không của tôi hoạt động bằng cách này)

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

Chức năng hoàn chỉnh cho bạn

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 ; 
Các vấn đề liên quan