计算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;