我知道这可以使用 FIND_IN_SET 来完成。但我需要一些不同的东西。
我的一个字段包含 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 表。
最佳答案
如果您没有使用 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
关于mysql - 使用 MySQL 在 CSV 中搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8472961/