2012-09-10 66 views
118

我有这样一个表:统计VARCHAR字段中字符串出现的次数?

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

我试图找出如何返回每个描述的发生串的次数。

所以,如果我要算时间“值”出现的次数,SQL语句将返回此:

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

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

+3

下面的回复将帮助你。但是,不要忘记使用['CHAR_LENGTH()'](http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_char-length)而不是['LENGTH( )'](http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_length)如果您使用多字节字符。 – inhan

+0

此线程也已在[这里]回答(https://stackoverflow.com/questions/5033047/mysql-query-finding-values-in-a-comma-separated-string/47069224#47069224) – Delickate

回答

221

这应该做的伎俩:

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

此解决方案是真棒,正是我需要的!但请注意,LENGTH()不是多字节安全的,您可能会遇到奇怪的错误。使用CHAR_LENGTH()代替:) –

+0

在您的单词中包含值时不起作用,例如“一般价值”。查询也计算这一行。 – chyupa

+0

“LENGTH()”和“CHAR_LENGTH()”在使用时除了相同的计数字节/字符之外没有区别。 @nicogawenda – MohaMad

9

在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,而是瞪大眼睛找LEN的等效是LENGTHREPLACE是相同。

所以在MySQL中相当于查询应该是

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

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

12

试试这个:

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


SQL Fiddle Demo

1
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 

雅尼斯感谢您的搜索解决方案ñ为我工作,我在这里分享同一解决方案的多个关键字的订单和限制。

1

这是一个可以做到的功能。 @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; 
6

一点点简单,但是更有效的变化:

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

不同的是,我用1炭较短的字符串(“1234”取代“值”串在这种情况下)。这样你就不需要划分和取整一个整数值。

+1

这确实是这里最棒的!谢谢。 –

相关问题