2012-09-10 18 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。 SQL Serverで

+3

下記の回答が届きます。しかし、 '' LENGTH()の代わりに['CHAR_LENGTH()'](http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_char-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() 'を同じカウントバイト/ charに分割して使用しても違いはありません。 @nicogawenda – MohaMad

9

が、これは

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と同等のものを見つけることgoggledはありませんREPLACEであるのに対しLENGTHです同じ。

だから、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 

おかげヤニス、あなたのsolutioをnは私のために働いていました。ここでは、複数のキーワードに対して同じソリューションを注文と制限付きで共有しています。

1

これを行う関数は次のとおりです。

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

少し簡素が、より効果的な@yannisソリューションのバリエーション:

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

違いは、私は、1文字短い文字列(「1234」と「値」の文字列を置換することですこの場合)。この方法で整数値を得るために分割して丸める必要はありません。

+1

これは本当にここで最高のものです!ありがとう。 –

関連する問題