2012-09-10 106 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

這確實是這裏最棒的!謝謝。 –

相關問題