2016-08-10 43 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;