여러 값과 같은 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.