Compter le nombre d'occurrences d'une chaîne dans un champ VARCHAR?

J'ai une table comme ceci:

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

J'essaie de comprendre comment renvoyer le nombre de fois qu'une chaîne se produit dans chacune des descriptions.

Donc, si je veux compter le nombre de fois que 'value' apparaît, l'instruction sql retournera ceci:

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

Y a-t-il un moyen de le faire? Je ne veux pas utiliser php du tout, juste mysql.

141
demandé sur Cœur 2012-09-10 06:39:14

6 réponses

Cela devrait faire l'affaire:

SELECT 
    title,
    description,    
    ROUND (   
        (
            LENGTH(description)
            - LENGTH( REPLACE ( description, "value", "") ) 
        ) / LENGTH("value")        
    ) AS count    
FROM <table> 
264
répondu yannis 2012-09-10 02:56:58

Essayez ceci:

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


Vous avez besoin d'aide?]}

13
répondu Joe G Joseph 2012-09-10 03:08:42

Dans SQL SERVER, c'est la réponse

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

Résultat

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

Je N'ai pas MySQL install, mais goggled pour trouver l'équivalent de LEN est LENGTH tandis que REPLACE est le même.

Donc la requête équivalente dans MySql devrait être

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

Faites-moi savoir si cela a également fonctionné pour vous dans MySql.

10
répondu Niladri Biswas 2017-05-02 11:25:18

Variation un peu plus simple et plus efficace de la solution @ yannis:

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

La différence est que je remplace la chaîne "value" par une chaîne plus courte de 1 caractère ("1234" dans ce cas). De cette façon, vous n'avez pas besoin de diviser et rond pour obtenir une valeur entière.

9
répondu gaborsch 2018-06-11 20:24:33
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

Merci Yannis, votre solution a fonctionné pour moi et ici je partage la même solution pour plusieurs mots clés avec order et limit.

1
répondu Trimantra Software Solution 2015-05-09 10:55:22

Voici une fonction qui va le faire.

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;
1
répondu michaelbn 2016-05-03 08:09:22