MySQL find_in_set有多个搜索字符串

时间:2011-02-16 10:42:49

标签: mysql search

我发现 find_in_set 只搜索一个字符串: -

find_in_set('a', 'a,b,c,d')

在上面的例子中,'a'是用于搜索的唯一字符串。

有没有办法使用find_in_set类功能并按多个字符串搜索,例如: -

find_in_set('a,b,c', 'a,b,c,d')

在上面的示例中,我想要搜索三个字符串'a,b,c'。

我看到的一种方法是使用 OR

find_in_set('a', 'a,b,c,d') OR find_in_set('b', 'a,b,c,d') OR find_in_set('b', 'a,b,c,d')

还有其他方法吗?

6 个答案:

答案 0 :(得分:93)

没有原生功能,但您可以使用以下技巧实现目标

WHERE CONCAT(",", `setcolumn`, ",") REGEXP ",(val1|val2|val3),"

答案 1 :(得分:14)

MySQL函数find_in_set()只能搜索一组字符串中的一个字符串。

第一个参数是一个字符串,所以没有办法让它将逗号分隔的字符串解析成字符串(你根本不能在SET元素中使用逗号!)。第二个参数是一个SET,它反过来用逗号分隔的字符串表示,因此你希望find_in_set('a,b,c', 'a,b,c,d')能够正常工作,但是根据定义它肯定无法在任何SET中找到字符串'a,b,c' - 它包含逗号。

答案 2 :(得分:1)

您也可以使用此自定义功能

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, ''); 

DELIMITER $$
    CREATE FUNCTION `FIND_SET_EQUALS`(`s1` VARCHAR(200), `s2`  VARCHAR(200)) 
    RETURNS TINYINT(1)
    LANGUAGE SQL
    BEGIN
          DECLARE a INT Default 0 ;
            DECLARE isEquals TINYINT(1) Default 0 ;
          DECLARE str VARCHAR(255);
          IF s1 IS NOT NULL AND s2 IS NOT NULL THEN
             simple_loop: LOOP
                 SET a=a+1;
                 SET str= SPLIT_STR(s2,",",a);
                 IF str='' THEN
                    LEAVE simple_loop;
                 END IF;
                 #Do  check is in set
                 IF FIND_IN_SET(str, s1)=0 THEN
                    SET isEquals=0;
                     LEAVE simple_loop;
                 END IF;
                 SET isEquals=1;
            END LOOP simple_loop;
          END IF;
        RETURN isEquals;
    END;
    $$
    DELIMITER ;

SELECT FIND_SET_EQUALS('a,c,b', 'a,b,c')- 1
SELECT FIND_SET_EQUALS('a,c', 'a,b,c')- 0
SELECT FIND_SET_EQUALS(null, 'a,b,c')- 0

答案 3 :(得分:0)

@Pavel Perminov 的惊人回答! - 还有@doru 对动态检查的好评论..

从那里我为 PHP 代码 CONCAT(',','" . $country_lang_id . "', ',') REGEXP CONCAT(',(', REPLACE(YourColumnName, ',', '|'), '),') 所做的这个下面的查询可能对正在寻找 PHP 的现成代码的人有用。

$country_lang_id = "1,2";

$sql = "select a.* from tablename a where CONCAT(',','" . $country_lang_id . "', ',') REGEXP CONCAT(',(', REPLACE(a.country_lang_id, ',', '|'), '),') ";

答案 4 :(得分:-1)

您也可以使用like命令:

where setcolumn like '%a,b%'

where 'a,b,c,d' like '%b,c%'

可能在某些情况下有用。

答案 5 :(得分:-7)

您可以使用in来查找两个值的匹配值

SELECT * FROM table WHERE  myvals in (a,b,c,d)