2012-02-24 2 views
0

필드에 키워드에 대한 문장과 일치하는 : John 사과 먹고 싶다MySQL의 쿼리 내가 같은 키워드 목록이있는 MySQL의 테이블이

문장이있는 필드를 쿼리하고 결과를 반환 할 수있는 mysql 쿼리 유형이 있습니까 (예 : 레코드 1).

+0

당신의 삶과 결합

%John%' OR Keyword like '%liked%' OR Keyword like '%to%' OR Keyword like '%eat%' OR Keyword like '%apples% 

것 다중 값 키워드를 별도의 행으로 분리 할 수 ​​있다면 매우 쉽게 수행 할 수 있습니다. – northpole

+0

매우 사실이며, 다른 응용 프로그램에 대해서는이 작업을 수행하지만 실제로는 꼭 필요한 것은 아닙니다. 아래 답변과 같이 빠르고 쉬운 방법이 필요합니다. – Joe

답변

2

apple, oranges, pearsapple|oranges|pears으로 변환하고 RLIKE (정규 표현식)을 사용하여 일치시킬 수 있습니다.

예를 들어, 'John은 사과'와 일치하는 'apple | orange | pears'와 일치하는 항목을 좋아했습니다.

먼저 'apple, oranges, pears'를 정규식으로 변환하려면 '|'로 모두 ','를 바꾸십시오. REPLACE을 사용하십시오. 그런 다음 일치하는 키워드 항목을 선택 RLIKE를 사용하지만이 당신의 쉼표로 분리가 일치되는에 의존 않습니다

SELECT * 
FROM keywords_table 
WHERE 'John liked to eat apples' RLIKE REPLACE(keywords,', ','|'); 

(즉이 REPLACE가 대체이 작동하지 않습니다 apples,oranges과 같은 하나 개의 행이있는 경우로 쉼표는 경우와 같은 문장 '요한이 파인애플을 먹는 것을 좋아'.

합니다 (예를 들어, 행에 따라) 또한,. 아주 잘 확장 할 수 있습니다

을 생각하지 않는 공백 , 위의 두 행과 일치합니다 ('사과'가 있음). 그러면 추가 할 수 있습니다. 단어 경계를 정규식 (즉, WHERE $sentence RLIKE '[[:<:]](apple|oranges|pears)[[:>:]]'), 복수형 ('사과'는 '[단어 경계] 사과 [단어 경계]'와 일치하지 않을 것입니다.)과 일치 할 때 이것이 일치하지 않을 것입니다.

+0

이 작업은 실제로 내 경우에 꽤 잘 작동합니다! – Joe

+0

+1 이것이 옵션 일지는 몰랐습니다. 잘 했어 !!! – northpole

0

해당 유형의 쿼리에 대한 직접적인 해결책을 모르겠습니다. 그러나 Full Text Search 가능성이 있습니다. 관심 분야에 전체 텍스트 색인이있는 경우 문장의 각 단어 사이에 OR의 검색이 있습니다 (비록 OR 연산자가 내포되어 있다고 생각할지라도) 해당 레코드를 찾을 수 있지만 원하는 것보다 더 많이 찾을 수도 있습니다 너무.

0

나는 정말로 당신이 찾고있는 것이 완전히 가능하다고 생각하지 않지만 전체 텍스트 검색이나 SOUNDEX을 볼 수 있습니다. 나는이 상황에서 그것을 해본 적이

WHERE SOUNDEX(sentence) = SOUNDEX('%'+keywords+'%'); 

하지만 당신은해야하고 내가 그것을 밖으로 작동하는 방법을 알려 : SOUNDEX는, 예를 들어, 뭔가 같이 할 수 있습니다.

0

쉼표로 구분 된 데이터를 저장하는 것이 이상적이지 않습니다. 개별 단어로 "요한이 사과를 먹고 좋아"문자열을 헤어진 경우
, 당신은 사용할 수 FIND_IN_SET operator :

WHERE FIND_IN_SET('apple', t.keywords) > 0 

성능은 큰되지 않을 것 -이 작업이 Full Text Search에 더 적합하다.

2

바라기를 이것은 당신이 필요로하는 것보다 추상적이지는 않지만 아마도 그것을하는 좋은 방법 일 것입니다. 나는 이것을 테스트하지는 않았지만 작동 할 것이라고 생각합니다.당신이 PHP를 사용할 수있는 경우에 당신은 위의 메아리 keyword LIKE '%apple%'

$sentence = "John liked to eat apples"; 

$sqlversion = str_replace(" ","%' OR Keyword like '%",$sentence); 

$finalsql = "%".$sqlversion."%"; 

에 공간을 켜 않는 str_replace를 사용할 수 있습니다 : 그럼 그냥 SQL 문

SQL ="SELECT * 
FROM keywords_table 
WHERE Keyword like" . $finalsql; 
+0

SQL하지만 좋은 솔루션으로 완료되지 않습니다. PHP가 옵션 인 경우. –

+0

@winner_joiner 감사합니다. 예, SQL 기술에 대한 연구가 필요합니다. $ sql = "... 같은 키워드"와 같아야합니다. $ finalsql; –