J'ai une table comme celle-ci:
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 DESCRIPTION.
Donc, si je veux compter le nombre de fois que 'value' apparaît, l'instruction sql renverra 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 faire ça? Je ne veux pas du tout utiliser php, juste mysql.
CHAR_LENGTH()
place deLENGTH()
si vous utilisez des caractères multi-octets.Réponses:
Cela devrait faire l'affaire:
la source
LENGTH()
et enCHAR_LENGTH()
étant divisé sur le même octet / caractère de comptage. @nicogawendaundevalue
ontvalue
en elle il doit être compté. Si vous ne voulez compter que des mots complets, vous devrez peut-être rechercher «valeur» ou mieux quelque chose de plus compliqué comme l'utilisation de regex.LENGTH( REPLACE ( LOWER(description), "value", "") )
et assurez-vous que "valeur" est toujours en minuscules en utilisant PHPstrtolower()
. PS: Cette solution ci-dessus m'a aidé à construire mon propre petit moteur de recherche et à pondérer les résultats par le nombre de mots dans le texte. Merci!ROUND
ici est inutile. supposons une chaîne de longueurx
avec desn
occurrences de'value
.LENGTH(description) - LENGTH( REPLACE ( description, "value", "") )
vous donnera toujoursn*length("value")
, la plongée qui par longueur de valeur laissera toujours un nombre entiern
. Pas besoin d'arrondirUne variante un peu plus simple et plus efficace de la solution @yannis:
La différence est que je remplace la chaîne "valeur" 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 d'arrondir pour obtenir une valeur entière.
Version généralisée (fonctionne pour chaque chaîne d'aiguille):
la source
essaye ça:
Démo SQL Fiddle
la source
Dans SQL SERVER, c'est la réponse
Résultat
Je n'ai pas installé MySQL, mais j'ai cherché à trouver l'équivalent de LEN est LENGTH tandis que REPLACE est le même.
Ainsi, la requête équivalente dans MySql devrait être
S'il vous plaît laissez-moi savoir si cela a fonctionné pour vous dans MySql également.
la source
Voici une fonction qui fera cela.
la source
Merci Yannis, votre solution a fonctionné pour moi et ici je partage la même solution pour plusieurs mots-clés avec ordre et limite.
la source
Voici la fonction mysql utilisant la technique de l'espace (testée avec mysql 5.0 + 5.5):
CREATE FUNCTION count_str( haystack TEXT, needle VARCHAR(32)) RETURNS INTEGER DETERMINISTIC RETURN LENGTH(haystack) - LENGTH( REPLACE ( haystack, needle, space(char_length(needle)-1)) );
la source