1. #1
    Membre habitué
    Inscrit en
    février 2009
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 423
    Points : 185
    Points
    185

    Par défaut Nombre d'occurrences dans un phrase

    Bonjour,

    Après avoir avoir consulté de nombreuses pages sur le sujet et effectué plusieurs tests, je me tourne vers vous pour avoir votre avis sur ce problème...

    Dans une table, j'ai un champ "texte" qui contient une ou plusieurs phrases, je souhaite récupérer par exemple le nombre de fois que le mot "hiver" apparaît,
    je précise que je me suis fait avoir en utilisant LIKE qui me retourne 1 alors que la phrase contienait 2 fois le mot recherché...

    Dans certains exemples, j'ai vu passer MATCH et AGAINTS mais je n'ai pas réussi à le mettre en œuvre, j'ai l'erreur suivante :

    Warning: mysql_result() expects parameter 1 to be resource, boolean given in C:\...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $class->countTable("matable", "WHERE MATCH(monchamptext) AGAINST('%".$_GET["search"]."%') AND ref_ouvrage='45' ");
     
    public function countTable($table,  $where)
    {
         $query = mysql_query("SELECT COUNT(*) FROM $table $where");
        return mysql_result($query, 0, 0);
     }
    En vous remerciant par avance de vos conseils,
    Cordialement,

  2. #2
    Membre expérimenté Avatar de vttman
    Homme Profil pro
    Mainframe et le WE (CSS, PHP, JS et MYSQL)
    Inscrit en
    décembre 2002
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Mainframe et le WE (CSS, PHP, JS et MYSQL)
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2002
    Messages : 805
    Points : 1 529
    Points
    1 529

    Par défaut

    Ceci fonctionne, trouvé sur le net "Comment trouver le nombre d’occurrences d’une chaîne de caractères dans MySQL?"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select LENGTH(monchamp) - LENGTH(REPLACE(monchamp, 'montexte', '        ')) as occ from `matable`
    Note : Pour le replace, il faudra le même nombre de blanc correspondant à 'montexte' donc ' '

    Sinon ceci aussi fonctionne, solution plus élégante ...
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT FLOOR(( LENGTH(monchamp) - LENGTH(REPLACE(monchamp, 'montexte', '')) ) / (LENGTH('montexte'))) as occ from `matable`
    Je suis sympa comme tout Mosellan mais ...
    ... (m')aider ou (me) mettre sur la voie c'est une chose
    ... tout (me) faire de A à Z, c'est pas ma conception du rôle d'un forum X ou Y
    Si vous n'êtes pas satisfait de mes réponses, n'hésitez pas à me le faire savoir Merci !

  3. #3
    Membre habitué
    Inscrit en
    février 2009
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 423
    Points : 185
    Points
    185

    Par défaut

    Bonjour et merci pour la réponse,

    j'ai essayé le code mais ça ne fonctionne toujours pas ça me retourne le nombre total de ligne ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo mysql_num_rows(mysql_query("SELECT FLOOR(( LENGTH(monchamp) - LENGTH(REPLACE(monchamp, '".$_GET["search"]."', '')) ) / (LENGTH('".$_GET["search"]."'))) as occ from $class->matable "));

  4. #4
    Membre expérimenté Avatar de vttman
    Homme Profil pro
    Mainframe et le WE (CSS, PHP, JS et MYSQL)
    Inscrit en
    décembre 2002
    Messages
    805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Mainframe et le WE (CSS, PHP, JS et MYSQL)
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2002
    Messages : 805
    Points : 1 529
    Points
    1 529

    Par défaut

    Ceci est à revoir
    =>
    car oui ça ne renverra pas le résultat espéré ...
    Je suis sympa comme tout Mosellan mais ...
    ... (m')aider ou (me) mettre sur la voie c'est une chose
    ... tout (me) faire de A à Z, c'est pas ma conception du rôle d'un forum X ou Y
    Si vous n'êtes pas satisfait de mes réponses, n'hésitez pas à me le faire savoir Merci !

  5. #5
    Membre habitué
    Inscrit en
    février 2009
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 423
    Points : 185
    Points
    185

    Par défaut

    Merci j'ai réessayé direct avec phpmyadmin j'ai bien la liste exacte des occurrences mais par ligne, certaines lignes ont une valeur 0 d'autres 1 ou 3 etc.
    en fait je cherche à récupérer le total par sql sans utiliser php pour refaire le total, un peu comme un count sql,

    c'est possible ça en MySQL seulement?

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 3 396
    Points : 10 481
    Points
    10 481

    Par défaut

    Salut à tous.

    L'astuce donné par VTTMAN fonctionne parfaitement.
    Il faut juste faire attention aux parenthèses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`       integer unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `text`     varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`text`) VALUES
    ('cat the'),('these cats'), ('their cat'),('that cat'),('cat and cats'),('dog and dogs')
    --------------
     
    --------------
    select * from test order by id
    --------------
     
    +----+--------------+
    | id | text         |
    +----+--------------+
    |  1 | cat the      |
    |  2 | these cats   |
    |  3 | their cat    |
    |  4 | that cat     |
    |  5 | cat and cats |
    |  6 | dog and dogs |
    +----+--------------+
    --------------
    select  length(text),
            length(replace(text, 'cat', '')),
            length('cat'),
            cast(((length(text) - length(replace(text, 'cat', ''))) / length('cat')) as unsigned) as nbre
      from  `test`
    --------------
     
    +--------------+----------------------------------+---------------+------+
    | length(text) | length(replace(text, 'cat', '')) | length('cat') | nbre |
    +--------------+----------------------------------+---------------+------+
    |            7 |                                4 |             3 |    1 |
    |           10 |                                7 |             3 |    1 |
    |            9 |                                6 |             3 |    1 |
    |            8 |                                5 |             3 |    1 |
    |           12 |                                6 |             3 |    2 |
    |           12 |                               12 |             3 |    0 |
    +--------------+----------------------------------+---------------+------+
    --------------
    select  sum(cast(((length(text) - length(replace(text, 'cat', ''))) / length('cat')) as unsigned)) as nbre
      from  `test`
    --------------
     
    +------+
    | nbre |
    +------+
    |    6 |
    +------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Membre habitué
    Inscrit en
    février 2009
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 423
    Points : 185
    Points
    185

    Par défaut

    Merci pour l'exemple, ça marche nickel avec SUM .. depuis hier je faisais une boucle while

    Par contre juste un détail que je n'est pas résolu, je souhaiterai que la requête soit insensible à la casse (mot : hiver, Hiver ou HIVER)
    j'ai essayé avec COLLATE utf8_bin qui fonctionnait bien avec LIKE précédemment, mais avec cette forme de requête ça retourne le message d'erreur suivant:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'COLLATE utf8_bin' at line 1

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 3 396
    Points : 10 481
    Points
    10 481

    Par défaut

    Salut dominos.

    Utilisez la fonction "lower()" pour transformer votre chaîne de caractères en minuscule.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Membre habitué
    Inscrit en
    février 2009
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 423
    Points : 185
    Points
    185

    Par défaut

    En fait avec LOWER, la requête recherche les occurrences en minuscules et le résultat retourné est faux car il peut y avoir dans le texte des occurrences ou la première lettre avec des majuscules..

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 3 396
    Points : 10 481
    Points
    10 481

    Par défaut

    Salut Dominos.

    Citation Envoyé par Dominos
    je souhaiterai que la requête soit insensible à la casse (mot : hiver, Hiver ou HIVER)
    Insensible à la casse signifie que l'on ne fait pas de différence entre les majuscules et les minuscules.
    Votre exemple reflète exactement cette définition.

    Citation Envoyé par Dominos
    En fait avec LOWER, la requête recherche les occurrences en minuscules et le résultat retourné est faux car il peut y avoir dans le texte des occurrences ou la première lettre avec des majuscules.
    Appliquer la fonction "lower()" aussi bien sur le colonne texte de votre table mysql, que sur le mot qui provient de php.
    Ainsi des deux cotés, vous allez comparer des minuscules avec des minuscules.
    Dans les faits, le mot que vous désirez rechercher doit être en minuscule.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Membre habitué
    Inscrit en
    février 2009
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 423
    Points : 185
    Points
    185

    Par défaut

    Super ça marche !!!

    En fait j'avais mis LOWER autour du mot recherché et pas du champ.

    Merci pour votre aide précieuse.


  12. #12
    Membre du Club
    Homme Profil pro
    Analyste-programmeur
    Inscrit en
    décembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2014
    Messages : 29
    Points : 59
    Points
    59

    Par défaut

    Citation Envoyé par dominos Voir le message
    Super ça marche !!!

    En fait j'avais mis LOWER autour du mot recherché et pas du champ.

    Merci pour votre aide précieuse.

    Petite précision. À l'époque et pour le cas cité (https://endormitoire.wordpress.com/2...g-using-mysql/), ma requête fonctionnait parce que les caractères n'étaient pas "multi-bytes". Donc, que ça fonctionne pour tous les CHARSETs, tu devrais remplacer LENGTH par CHAR_LENGTH !

  13. #13
    Membre habitué
    Inscrit en
    février 2009
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 423
    Points : 185
    Points
    185

    Par défaut

    Merci, cet exemple permet effectivement de récupérer le nombre d'occurrences dans une phrase à la différence de LIKE qui récupère vrai même si dans une phrase 2 occurrences ou plus sont présentes.

    Néanmoins, sur un gros volume de données à traiter, il apparaissait de nombreuse erreurs, notamment des problèmes de mots-mêlés, ex : ami se retrouve dans f"ami"lle, etc.

    Une solution m'a été proposé sur ce forum que j'ai ensuite adapté également à cette syntaxe de comptage d'occurrences, le résultat est maintenant beaucoup plus précis et le problème de mots-mêlés résolu.

    Il suffit d'ajouter une REGEXP à la clause Where :
    https://www.developpez.net/forums/d1...onfusion-like/

    Bon dimanche,

  14. #14
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 3 396
    Points : 10 481
    Points
    10 481

    Par défaut

    Salut Domino.

    La question imprécise de votre premier message nous a conduit à vous proposer cette solution.
    L'imprécision se porte, en effet, sur l'interprétation de ce que vous nommez "mot".

    Vous recherchez le mot "ami" et le résultat vous donne "famille",ce n'est pas une erreur en soi.

    Je rappelle que votre question de départ se portait sur :
    Citation Envoyé par Domino
    je précise que je me suis fait avoir en utilisant LIKE qui me retourne 1 alors que la phrase contiendrait 2 fois le mot recherché...
    Autrement dit, vous recherchez le nombre d'occurrences d'une chaîne de caractères dans une phrase.
    Ce à quoi VTTMAN vous a donné la solution !

    Citation Envoyé par domino
    Il suffit d'ajouter une REGEXP à la clause Where :
    Non, pas du tout car un "REGEXP" (expression régulière) permet d'indiquer si dans une phrase, il existe la présence d'un mot.
    Cela ne permet pas déterminer le nombre d'occurrences de ce mot.

    Citation Envoyé par domino
    j'ai lu un bout sur l'utilisation de "_" et effectué quelques tests... les résultats sont faux, il manque un certains nombre d'occurrences qui pourtant étaient bonnes,
    Si dès le départ vous aviez posé correctement votre problème, en donnant des exemples de ce que vous désirez obtenir, vous n'auriez pas perdu autant de temps sur ce sujet.

    Si je prends la phrase suivante "un gamin des amis amish de ma famille a battu mamie au rami".
    Combien de fois se trouve le mot "ami" dans cette phrase ? Réponse : 0 fois.
    Alors que la chaîne de caractères "ami" est présente six fois.

    Et même si cette ligne est sélectionnée, il est impossible de trouver le nombre d'occurrences du mot "ami" si vous ne définissez pas, avec précision, ce que vous recherchez.

    Citation Envoyé par domino
    La reg ci-dessus retourne systématiquement le pluriel, comment faire pour qu'il en tienne compte seulement dans l'éventualité d'un pluriel trouvée ?
    Le pluriel d'amis prend un "s". Sauf que tous les pluriels ne prennent pas un "s" final. Votre solution ne fonctionne pas ! Pourquoi ?
    Car dans cet exemple, le mot "amish" contient le mot "amis" et sera aussi comptabilisé alors qu'il ne devrait pas l'être.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  15. #15
    Membre du Club
    Homme Profil pro
    Analyste-programmeur
    Inscrit en
    décembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2014
    Messages : 29
    Points : 59
    Points
    59

    Par défaut

    Citation Envoyé par Artemus24 Voir le message
    Salut Domino.

    La question imprécise de votre premier message nous a conduit à vous proposer cette solution.
    L'imprécision se porte, en effet, sur l'interprétation de ce que vous nommez "mot".
    Exactement! En fait, il lui faudra rechercher plusieurs autres variantes (tout en supposant les majuscules pour les débuts de phrases) localisées à différents endroits dans la phrase (et/ou avec diverses ponctuations). Et doit-il aussi considérer le féminin, amie/amies ?

    Donc :

    /* En début de phrase */
    'Ami %'
    'Amis %'
    'Ami, %'
    'Amis, %'
    'Ami: %'
    'Amis: %'
    'Ami! %'
    'Amis! %'
    '_\'ami %'
    '_\'amis %'

    /* En milieu de phrase */
    '% ami %'
    '% amis %'
    '% ami: %'
    '% amis: %'
    '% ami; %'
    '% amis; %'
    '% \'ami %'
    '% \'amis %'
    '% \'ami: %'
    '% \'amis: %'
    '% \'ami; %'
    '% \'amis; %'

    /* En fin de phrase */
    '% ami.'
    '% amis.'
    '% \'ami.'
    '% \'amis.'
    '% ami!'
    '% amis!'

  16. #16
    Membre habitué
    Inscrit en
    février 2009
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 423
    Points : 185
    Points
    185

    Par défaut

    Bonjour,

    merci d'avoir pris le temps pour ce sujet, si je me suis mal exprimé j'en suis vraiment désolé le problème est donc le suivant :

    Dans une table j'ai près de 100000 lignes de texte à traiter, et dans un outils de recherche, je recherche un "mot", par exemple "ami" pour changer ...

    La recherche du pluriel est optionnelle (checkbox) mais n'entrons pas dans les détails... je part du principe que je recherche le mot tel qu'il est saisie et quelque soit son emplacement dans une phrase et quelque soit le nombre de fois qu'il est présent,

    Exemple de recherche :

    Phrase (ligne 1) => "un gamin des amis amish de ma famille a battu mamie au rami, mais habituellement, les amishs ne jouent pas au rami".

    Phrase (ligne 2) => "un ami m'a raconté que un gamin des amis amish de ma famille a battu mamie au rami, mais habituellement, les amishs ne jouent pas au rami".

    Phrase (ligne 3) => "un ami qui est un véritable ami m'a raconté que un gamin des amis amish de ma famille a battu mamie au rami, mais habituellement, les amishs ne jouent pas au rami".

    Total recherché = 3 occurrences et non 27


    Effectivement, après plus de 3 heures de vérification, il existe toujours des erreurs et ce même avec une REGEXP, ce sont principalement des erreurs de mots mélés bien que la quantité d'erreurs semble avoir sensiblement diminué.

    Comment faire alors ?

  17. #17
    Membre du Club
    Homme Profil pro
    Analyste-programmeur
    Inscrit en
    décembre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : Conseil

    Informations forums :
    Inscription : décembre 2014
    Messages : 29
    Points : 59
    Points
    59

    Par défaut

    Citation Envoyé par dominos Voir le message
    Effectivement, après plus de 3 heures de vérification, il existe toujours des erreurs et ce même avec une REGEXP, ce sont principalement des erreurs de mots mélés bien que la quantité d'erreurs semble avoir sensiblement diminué.
    Comment faire alors ?
    Je viens d'arriver du travail et comme ce genre de petit défi m'amuse, je vais plancher là-dessus demain. J'ai une assez bonne idée de comment procéder. Mais avant, quelques questions...

    1) Devez-vous tenir des formes élidées du mot?
    a) l'ami,
    b) les z'amis
    c) puisqu'ami
    d) un conseil d'ami

    2) Devez-vous tenir compte de la ponctuation, quand on sait que le mot cherché ne sera pas toujours isolé entre 2 espaces ?
    a) Amis! Au front!
    b) Il était mon ami, c'était aussi simple que ça.
    c) Elle a pleuré, tout en me regardant, en sachant que partait son seul ami...

    Bref, j'imagine que vous désirez, comme un humain le ferait, trouver toutes les occurences du mot "ami" dans une phrase, quels que soient les marqueurs de début et de fin (habituellement la ponctuation) qui pourraient "contaminer" (en étant accollés comme préfixe ou suffixe au mot recherché) votre recherche?

    Quand au pluriel, vous devrez trouver une autre solution et/ou la gérer vous-même! Tout fonctionne bien dans le cas de ami/amis mais dans le cas de ail (qui peut faire "ails" et "aulx" au pluriel), par exemple, tout se complique!!!

  18. #18
    Membre habitué
    Inscrit en
    février 2009
    Messages
    423
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 423
    Points : 185
    Points
    185

    Par défaut

    Bonjour,

    Merci pour le soutient, en fait j'image que le mot recherché peut effectivement être suivi d'une ponctuation, exemple "...un ami, m'a raconté" ou "... par un ami.", je pense que si le mot seul est recherché, la ponctuation ou une apostrophe ne devraient automatiquement pas pris en compte. Comme le montre mon précédent exemple, je souhaite juste récupérer les mots en vert.

    Autre phrase (ligne 3) => "un ami, qui est un véritable ami m'a raconté que un gamin des amis amish de ma famille a battu mamie au rami, mais habituellement, l'amish qu'avec l'ami de mamie."

    Total = 3 occurrences

    Si vous avez une piste, merci d'avance,
    Bonne journée,

  19. #19
    Membre confirmé Avatar de Sebwar
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    avril 2012
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : avril 2012
    Messages : 170
    Points : 519
    Points
    519

    Par défaut

    oups^^

  20. #20
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 3 396
    Points : 10 481
    Points
    10 481

    Par défaut

    Salut Domino.

    J'ai fait une recherche sur le "full text search" sans avoir trouvé le moyen de comptabiliser le nombre de mots dans une ligne.
    J'arrive à déterminer si une ligne contient le mot recherche, comme ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select id,
           match(`lib`) against('ami' in boolean mode) as score
      from  test
    --------------
     
    +----+-------+
    | id | score |
    +----+-------+
    |  1 |     0 |
    |  2 |     1 |
    |  3 |     1 |
    +----+-------+
    Le 0 signifie absence du mot et 1 sa présence.
    Avec cette approche, il n'est pas possible de comptabiliser le nombre de fois que le mot apparait.

    Ce qui revient à faire ce test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select    id,
              lib regexp '.*[[:<:]]ami[[:>:]].*' as nbre
        from  test
    --------------
     
    +----+------+
    | id | nbre |
    +----+------+
    |  1 |    0 |
    |  2 |    1 |
    |  3 |    1 |
    +----+------+
    En ce qui concerne le nombre d'occurrence du mot "ami", le problème vient que nous ne savons, sous mysql, isoler un mot dans une chaîne de caractères.
    Par contre, nous savons isoler une chaîne de caractères.

    A tout hasard, je donne la fonction de comptabilisation du nombre d'occurrence d'une chaine de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    DELIMITER $$
     
    CREATE FUNCTION `getCount`(myStr text, myword text)
      RETURNS INTEGER
      BEGIN
      DECLARE cnt    INTEGER DEFAULT 0;
      DECLARE result INTEGER DEFAULT 1;
     
      WHILE (result > 0)
      DO
          SET result = INSTR(myStr, myword);
          IF(result > 0) THEN 
              SET cnt = cnt + 1;
              SET myStr = SUBSTRING(myStr, result + LENGTH(myword));
          END IF;
      END WHILE;
     
      RETURN cnt;
    END$$
     
    DELIMITER ;
    Et un exemple de comptabilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select  id,
            getCount(lib, 'ami') as nbre
      from  test
    --------------
     
    +----+------+
    | id | nbre |
    +----+------+
    |  1 |    8 |
    |  2 |    9 |
    |  3 |   10 |
    +----+------+
    Dont le total donne 8 + 9 + 10 = 27.

    Nous savons, avec le regexp ci-dessus, déterminer si dans une phrase, nous avons le mot "ami".
    Sauf que je ne sais pas comment gérer ce regexp dans la fonction et plus précisément, comment remplacer le fonction "INSTR()".

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [WD14] Nombre de mot dans une phrase
    Par ecoinfo dans le forum WinDev
    Réponses: 6
    Dernier message: 27/01/2010, 00h19
  2. Limiter le nombre d'occurrences dans une dimension
    Par klognos dans le forum Cognos
    Réponses: 1
    Dernier message: 31/05/2008, 23h29
  3. Réponses: 2
    Dernier message: 06/05/2007, 23h43
  4. Determiner le nombre de majuscules dans une phrase
    Par cirtey dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 02/03/2007, 09h36
  5. Nombre de 'e' dans un phrase
    Par skulled dans le forum C
    Réponses: 25
    Dernier message: 03/01/2007, 14h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo