我有一个这样的表格:

TITLE          |   DESCRIPTION
------------------------------------------------
test1          |   value blah blah value
test2          |   value test
test3          |   test test test
test4          |   valuevaluevaluevaluevalue

我试图弄清楚如何返回一个字符串出现在每个描述的次数。

所以,如果我想计算“value”出现的次数,sql语句将返回:

TITLE          |   DESCRIPTION                  |   COUNT
------------------------------------------------------------
test1          |   value blah blah value        |   2
test2          |   value test                   |   1
test3          |   test test test               |   0
test4          |   valuevaluevaluevaluevalue    |   5

有什么办法可以做到吗?我根本不想用php,只用mysql。


当前回答

在大多数情况下,这些函数分别是LENGTH和REPLACE (SQL Server用户将使用内置函数LEN而不是LENGTH):

示例:计算字符串“10,CLARK,MANAGER”中逗号的个数。

select (length('10,CLARK,MANAGER')-
        length(replace('10,CLARK,MANAGER',',','')))/length(',')
as cnt from t1

其他回答

试试这个:

 select TITLE,
        (length(DESCRIPTION )-length(replace(DESCRIPTION ,'value','')))/5 as COUNT 
  FROM <table> 

SQL小提琴演示

SELECT 
id,
jsondata,    
ROUND (   
    (
        LENGTH(jsondata)
        - LENGTH( REPLACE ( jsondata, "sonal", "") ) 
    ) / LENGTH("sonal")        
)
+
ROUND (   
    (
        LENGTH(jsondata)
        - LENGTH( REPLACE ( jsondata, "khunt", "") ) 
    ) / LENGTH("khunt")        
)
AS count1    FROM test ORDER BY count1 DESC LIMIT 0, 2

谢谢Yannis,你的解决方案为我工作,在这里我分享相同的解决方案,多个关键字的顺序和限制。

这是一个函数。

CREATE FUNCTION count_str(haystack TEXT, needle VARCHAR(32))
  RETURNS INTEGER DETERMINISTIC
  BEGIN
    RETURN ROUND((CHAR_LENGTH(haystack) - CHAR_LENGTH(REPLACE(haystack, needle, ""))) / CHAR_LENGTH(needle));
  END;

@yannis解决方案的一个更简单、更有效的变种:

SELECT 
    title,
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH( REPLACE ( description, 'value', '1234') ) 
        AS `count`    
FROM <table> 

不同之处在于,我将“value”字符串替换为一个1字符的短字符串(在本例中为“1234”)。这样你就不需要进行除法和四舍五入来得到一个整数值。

通用版(适用于所有针串):

SET @needle = 'value';
SELECT 
    description,    
    CHAR_LENGTH(description) - CHAR_LENGTH(REPLACE(description, @needle, SPACE(LENGTH(@needle)-1))) 
        AS `count`    
FROM <table> 

在大多数情况下,这些函数分别是LENGTH和REPLACE (SQL Server用户将使用内置函数LEN而不是LENGTH):

示例:计算字符串“10,CLARK,MANAGER”中逗号的个数。

select (length('10,CLARK,MANAGER')-
        length(replace('10,CLARK,MANAGER',',','')))/length(',')
as cnt from t1