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.
6 réponses
Cela devrait faire l'affaire:
SELECT
title,
description,
ROUND (
(
LENGTH(description)
- LENGTH( REPLACE ( description, "value", "") )
) / LENGTH("value")
) AS count
FROM <table>
Essayez ceci:
select TITLE,
(length(DESCRIPTION )-length(replace(DESCRIPTION ,'value','')))/5 as COUNT
FROM <table>
Vous avez besoin d'aide?]}
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.
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.
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.
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;