2011-12-12 76 views
0

我知道這可以使用FIND_IN_SET完成。但我需要一些與衆不同的東西。用CSV搜索用MySQL搜索

我的一個字段包含由逗號分隔的6位數字。其他字符串最多有5個值,用逗號分隔。

所以我想獲得匹配值的計數。

像:

Database value: 1,2,3,4,5,6 
Search Value: 1,2,3,4 

這會給4.

Database value: 1,2,3,4,5,6 
Search Value: 1,2,3,4,6 

這會給5.

Database value: 1,2,3,4,5,6 
Search Value: 1,4 

這會給2.

我使用有InnoDB表。

回答

2

如果你不使用InnoDB表,我會建議在一些描述中使用full text search。但是你正在使用InnoDB!

這就是說我會走下user defined function的路線,特別是存儲的功能。幸運的是,我已經從previous post上得到了一個。我調整了它,以便您可以通過任何分隔符。既然它是一個函數,你可以在查詢中使用它,就像其他任何MySQL函數一樣。

希望它有幫助。

DROP FUNCTION IF EXISTS `CompareStrings`; 

DELIMITER $$ 

CREATE FUNCTION `CompareStrings`(str1 VARCHAR(255),str2 VARCHAR(255), delimiter VARCHAR(1)) RETURNS double 
READS SQL DATA 
BEGIN 
DECLARE cur_position INT DEFAULT 1 ; 
DECLARE remainder TEXT; 
DECLARE cur_string VARCHAR(255); 
DECLARE delimiter_length TINYINT UNSIGNED; 
DECLARE total INT; 
DECLARE result DOUBLE DEFAULT 0; 
DECLARE string2 VARCHAR(255); 

SET remainder = str1; 
SET string2 = concat(delimiter,trim(str2),delimiter); 
SET delimiter_length = CHAR_LENGTH(delimiter); 
SET cur_position = 1; 

WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO 
    SET cur_position = INSTR(remainder, delimiter); 
    IF cur_position = 0 THEN 
     SET cur_string = remainder; 
    ELSE 
     SET cur_string = concat(delimiter,LEFT(remainder, cur_position - 1),delimiter); 
    END IF; 
    IF TRIM(cur_string) != '' THEN 
     set result = result + (select instr(string2,cur_string) > 0); 
    END IF; 
    SET remainder = SUBSTRING(remainder, cur_position + delimiter_length); 
END WHILE; 

RETURN result; 

END$$ 

DELIMITER ; 

然後,您可以運行類似:

select CompareStrings('1,2,3,4,5,6','1,2,3,4',',') 

,你會得到4:

select CompareStrings('1,2,3,4,5,6','1,2,3,4,6',',') 

,你會得到5

0

我已創建1功能和1是從MySQL網站找到的:

該函數給出了定義分隔符的字符串中給定位置的值。

DELIMITER $$ 

CREATE FUNCTION `SplitString`(x varchar(255), delim varchar(12), pos int) RETURNS varchar(255) CHARSET latin1 
return replace(substring(substring_index(x, delim, pos), length(substring_index(x, delim, pos - 1)) + 1), delim, '') 

該函數使用上述函數並服務於我的目的。

DELIMITER $$ 

CREATE FUNCTION `get_matched`(my_num varchar(100), to_match_num VARCHAR(100)) RETURNS int(11) 
BEGIN 

DECLARE temp, total INT; 
SET total=0; 
SET temp = IF(FIND_IN_SET(SplitString(my_num,',',1), to_match_num)>0,1,0); 
SET total = total+ temp; 

SET temp = IF(FIND_IN_SET(SplitString(my_num,',',2), to_match_num)>0,1,0); 
SET total = total+ temp; 

SET temp = IF(FIND_IN_SET(SplitString(my_num,',',3), to_match_num)>0,1,0); 
SET total = total+ temp; 

SET temp = IF(FIND_IN_SET(SplitString(my_num,',',4), to_match_num)>0,1,0); 
SET total = total+ temp; 

SET temp = IF(FIND_IN_SET(SplitString(my_num,',',5), to_match_num)>0,1,0); 
SET total = total+ temp; 

SET temp = IF(FIND_IN_SET(SplitString(my_num,',',6), to_match_num)>0,1,0); 
SET total = total+temp; 

RETURN total; 
END