programing

MySQL find_in_set(복수 검색 문자열 포함)

bestcode 2022. 9. 21. 00:09
반응형

MySQL find_in_set(복수 검색 문자열 포함)

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')

위의 예에서는 3개의 문자열 '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')

이것 말고 다른 방법이 있나요?

그것을 할 수 있는 네이티브 기능은 없지만, 당신은 다음의 트릭을 사용하여 당신의 목적을 달성할 수 있다.

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

MySQL 함수는 문자열 집합에서 하나의 문자열만 검색할 수 있습니다.

첫 번째 인수는 문자열이므로 쉼표로 구분된 문자열을 문자열로 해석할 수 없습니다(SET 요소에는 쉼표를 전혀 사용할 수 없습니다).두 번째 인수는 SET입니다.SET 인수는 쉼표로 구분된 문자열로 나타나기 때문에 원하는 대로 사용할 수 있습니다.find_in_set('a,b,c', 'a,b,c,d')잘 작동하지만, 확실히 끈을 찾을 수 없습니다.'a,b,c'모든 SET에서 정의 - 쉼표가 포함되어 있습니다.

이 커스텀 기능을 사용할 수도 있습니다.

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

@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, ',', '|'), '),') ";

와, 아무도 여기서 이런 얘기를 하지 않은 게 놀랍네요.
간단히 말하면, 멤버의 순서를 알고 있는 경우는, 1비트의 조작으로 쿼리를 실시합니다.

SELECT * FROM example_table WHERE (example_set & mbits) = mbits;

설명:

'HTML', 'CSS', 'PHP', 'JS' 등의 순서로 멤버가 있는 세트가 있으면
MySQL에서는 다음과 같이 해석됩니다.

"HTML" = 0001 = 1
"CSS"  = 0010 = 2
"PHP"  = 0100 = 4
"JS"   = 1000 = 16

예를 들어 세트에 "HTML"과 "CSS"가 있는 모든 행을 쿼리하려면 다음과 같이 입력합니다.

SELECT * FROM example_table WHERE (example_set & 3) = 3;

왜냐면00113둘 다0001 "HTML" 그리고0010 를 클릭합니다"CSS".

세트는 REGEXP, LIKE, FIND_ 등의 다른 메서드를 사용하여 쿼리할 수 있습니다.IN_SET() 등입니다.필요한 건 뭐든지 써.

예를 들어 다음과 같은 명령어를 사용할 수도 있습니다.

where setcolumn like '%a,b%'

또는

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

어떤 상황에서는 효과가 있을 수 있습니다.

를 사용하여 2개의 값에서 일치값을 찾을 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/5015403/mysql-find-in-set-with-multiple-search-string

반응형