여러 값과 같은 MySQL


144

이 MySQL 쿼리가 있습니다.

이 내용의 데이터베이스 필드가 있습니다

sports,shopping,pool,pc,games 
shopping,pool,pc,games 
sports,pub,swimming, pool, pc, games   

쿼리와 같은 기능이 작동하지 않는 이유는 무엇입니까? 스포츠 나 펍 또는 둘 다가있는 필드가 필요합니까?

SELECT * FROM table WHERE interests LIKE ('%sports%', '%pub%')

답변:


133

이 (a,b,c)목록은에서만 작동합니다 in. 의 경우 다음 like을 사용해야합니다 or.

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'

3
이것은 다중 (5 개 이상의 동적 검색 가능 쿼리)에는 도움이되지 않으므로 regexp를 사용하는 것이 좋습니다.
— Shayan Ahmad

315

더 빠른 방법 :

WHERE interests LIKE '%sports%' OR interests LIKE '%pub%'

이것입니다 :

WHERE interests REGEXP 'sports|pub'

이 솔루션을 여기에서 찾았습니다 : http://forums.mysql.com/read.php?10,392332,392950#msg-392950

REGEXP에 대한 자세한 내용은 여기 ( http://www.tutorialspoint.com/mysql/mysql-regexps.htm)를 참조 하십시오.


알 수없는 양의 키워드를 문자열 (a | b | c ...)로 전달하는 경우 정규 표현식이 LIKE를 원한다면 갈 수있는 유일한 방법입니까?
— 자주

1
하위 쿼리로이 작업을 수행 할 수 있는지 알고 있습니까? 검색해야 할 단어 열이 있는데 'sports | pub'을 하위 쿼리로 바꾸려면 어떻게해야합니까?
— AdamMc331

이봐, % LIKE % 대신 LIKE의 REGEXP를 말씀해 주시겠습니까? 정확한 문자열을 가져 오려고합니다 ...
— Deepanshu Goyal

3
이 솔루션은 물 밖으로 첫 번째를 날려
— Donato

2
열에서 정규 표현식 값을 가져 오려면 :(select group_concat(myColumn separator '|') from..)
— daVe

34

REGEXP를 사용해보십시오. 다음과 같이 시도하십시오.

SELECT * FROM table WHERE interests REGEXP 'sports|pub'

5
네!! 나는 그것을 반대 방향으로 원한다. 그래서 그것은 SELECT * FROM table WHERE interests NOT REGEXP 'sports|pub' (> ‿◠) ✌
— Pathros

3
이 답변이 jazkat5 년 전에 제출 된 답변과 다른 점은 무엇입니까?
— Vaidas

@Vaidas-감사합니다-나 자신에게 같은 질문을하고있었습니다 ... : D
— theFriedC

18

사용할 수도 있습니다 RLIKE.

예를 들면 다음과 같습니다.

SELECT * FROM TABLE_NAME WHERE COLNAME RLIKE 'REGEX1|REGEX2|REGEX3'

6
RLIKE와 REGEXP는 동의어입니다.
— Intacto

8

귀하의 검색어는 SELECT * FROM `table` WHERE find_in_set(interests, "sports,pub")>0

내가 이해하는 것은 테이블의 한 필드에 관심사를 저장한다는 것입니다. 이것은 오해입니다. 확실하게 "관심"테이블이 있어야합니다.


2
나는 그것이 있어야한다고 생각 SELECT * FROM table WHERE find_in_set(interests, 'sports,pub')하지만,이 기술은 대부분의 상황에서 정규 표현식보다 성능이 뛰어납니다.
— Chris Strickland

7

AND매개 변수 뒤에이 함수를 사용하는 경우 괄호를 사용하는 것을 잊지 마십시오

이처럼 :

WHERE id=123 and(interests LIKE '%sports%' OR interests LIKE '%pub%')


2

@Alexis Dufrenoy가 제안한 것처럼 쿼리는 다음과 같습니다.

SELECT * FROM `table` WHERE find_in_set('sports', interests)>0 OR find_in_set('pub', interests)>0

매뉴얼의 추가 정보 .


1

더 많은 작업 예 :

SELECT COUNT(email) as count FROM table1 t1 
JOIN (
      SELECT company_domains as emailext FROM table2 WHERE company = 'DELL'
     ) t2 
ON t1.email LIKE CONCAT('%', emailext) WHERE t1.event='PC Global Conference";

이메일 확장이 여러 회사 도메인과 동일한 경우 필터를 사용하여 이벤트에서 참가자 수를 계산했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.