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;
왜냐면0011
는3
둘 다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
'programing' 카테고리의 다른 글
새로운 판다 칼럼을 만들기 위해 여러 인수가 있는 기능 적용 (0) | 2022.09.21 |
---|---|
도커 마리아 데이터베이스에 접속하려면 어떻게 해야 하나요? (0) | 2022.09.21 |
장고 모델() 대 Model.objects.create() (0) | 2022.09.21 |
라라벨에서 phpunit을 사용하여 특정 테스트 클래스를 테스트하는 방법 (0) | 2022.09.21 |
기존 테이블에 자동 증가 기본 키 삽입 (0) | 2022.09.21 |