2016-08-10 46 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

編輯:基於OP的評論,讓行,其中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

正如我所說:'在哪裏條款' –

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

如果你不想使用CASE - 你能指望這樣的話:

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;