2016-08-10 5 views
0

에 대해 서로 다른 단어를 표시 횟수 개수 : 나는 각 행에 대해 다른 단어를 표시하는 횟수를 계산하려면내가 MySQL의 테이블과 같이이 각 행

id   content 
-----  ------ 
1   Big green tree 
2   Small green tree 
3   Green tree 
4   Small yellow tree 
5   Big green lake 

.

예 : 나는 , 녹색트리를 검색합니다. 그것은 다음과 같은 결과를 반환해야합니다

id   count 
-----  ------ 
1   3 
2   2 
3   2 
4   1 
5   2 

내가 좋아하는 뭔가를 시도 :

SELECT `content` 
    , COUNT(*) as count 
    FROM `elements` 
WHERE `content` LIKE '%Big%' 
    OR `content` LIKE '%green%' 
    OR `content` LIKE '%tree%' 
GROUP 
    BY `id` 
ORDER BY count DESC; 

그것은하지 않습니다 작품은 모든 경기 만 행 반환하기 때문에 : 당신이 경우

id   count 
-----  ------ 
1   1 
2   1 
3   1 
4   1 
5   1 

답변

4

단어 경계에 regexp을 사용할 수 있습니다. 생성 된 일치는 대소 문자를 구분하지 않습니다. 대/소문자가 일치해야하는 경우 REGEXP BINARY을 사용하십시오. : - :

SELECT `content`, 
CASE WHEN `content` REGEXP '[[:<:]]big[[:>:]]' THEN 1 ELSE 0 END + 
CASE WHEN `content` REGEXP '[[:<:]]green[[:>:]]' THEN 1 ELSE 0 END + 
CASE WHEN `content` REGEXP '[[:<:]]tree[[:>:]]' THEN 1 ELSE 0 END 
     as num_matches   
FROM `elements` 
ORDER BY id 

Sample Fiddle

편집이 같은 단어를 셀 수는 CASE를 사용하지 않으려면 NUM_MATCHES이> 0

SELECT * FROM (
SELECT `content`, 
CASE WHEN `content` REGEXP '[[:<:]]big[[:>:]]' THEN 1 ELSE 0 END + 
CASE WHEN `content` REGEXP '[[:<:]]green[[:>:]]' THEN 1 ELSE 0 END + 
CASE WHEN `content` REGEXP '[[:<:]]tree[[:>:]]' THEN 1 ELSE 0 END 
     as num_matches   
FROM `elements`) t 
WHERE num_matches > 0 
+0

좋은 해결책이지만 num_matches <0 (where 절에 추가 할 수 없음) 행을 피하기 원합니다. –

+0

편집을 참조하십시오 ... –

+0

내가 말했듯이 : 알 수없는 열 'num_matches'where where 절 ' –

3

content 내에서 중복 된 단어는 신경 쓰지 마세요.

SELECT `content`, 
     ((CASE WHEN `content` LIKE '%Big%' THEN 1 ELSE 0 END) + 
     (CASE WHEN `content` LIKE '%green%' THEN 1 ELSE 0 END) + 
     (CASE WHEN `content` LIKE '%lake%' THEN 1 ELSE 0 END) 
     ) as matches   
FROM `elements` 
WHERE `content` LIKE '%Big%' OR 
     `content` LIKE '%green%' OR 
     `content` LIKE '%tree%' 
ORDER BY matches DESC; 
1

경우 영업 이익의 의견을 바탕으로, 행을 얻을 수 있습니다

SELECT id, COUNT(*) as count 
    FROM (
    select id from elements WHERE content LIKE '%Big%' 
    union all 
    select id from elements WHERE content LIKE '%green%' 
    union all 
    select id from elements WHERE content LIKE '%tree%' 
) as t 
GROUP BY id 
ORDER BY count DESC; 
관련 문제