计算VARCHAR字段中string的出现次数?

我有这样一张桌子:

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

我想弄清楚如何返回每个DESCRIPTION中string出现的次数。

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

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

有没有办法做到这一点? 我不想使用PHP,只是MySQL。

这应该做的伎俩:

 SELECT title, description, ROUND ( ( LENGTH(description) - LENGTH( REPLACE ( description, "value", "") ) ) / LENGTH("value") ) AS count FROM <table> 

尝试这个:

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

SQL小提琴演示

在SQL SERVER中,这是答案

 Declare @t table(TITLE VARCHAR(100), DESCRIPTION VARCHAR(100)) INSERT INTO @t SELECT 'test1', 'value blah blah value' INSERT INTO @t SELECT 'test2','value test' INSERT INTO @t SELECT 'test3','test test test' INSERT INTO @t SELECT 'test4','valuevaluevaluevaluevalue' SELECT TITLE,DESCRIPTION,Count = (LEN(DESCRIPTION) - LEN(REPLACE(DESCRIPTION, 'value', '')))/LEN('value') FROM @t 

结果

 TITLE DESCRIPTION Count test1 value blah blah value 2 test2 value test 1 test3 test test test 0 test4 valuevaluevaluevaluevalue 5 

我没有安装MySQL,但是在REPLACE相同的情况下,用goggledfindLEN的等价物是LENGTH 。

所以在MySql中的等效查询应该是

 SELECT TITLE,DESCRIPTION, (LENGTH(DESCRIPTION) - LENGTH(REPLACE(DESCRIPTION, 'value', '')))/LENGTH('value') AS Count FROM <yourTable> 

请让我知道,如果它在MySql也为你工作。

更简单一点,但更有效的@yannis解决scheme的变化:

 SELECT title, description, LENGTH(description) - LENGTH( REPLACE ( description, "value", "1234") ) AS count FROM <table> 

不同之处在于我用一个长度为1个字符的string(本例中为“1234”)replace“值”string。 这样你就不需要划分和取整一个整数值。

 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,你的解决scheme为我工作,在这里我分享同一个解决scheme的多个关键字与订单和限制。

这是一个可以做到的function。

 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;