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

    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
    Développeur COBOL et le WE (CSS, PHP, JS et MYSQL)
    Inscrit en
    décembre 2002
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : décembre 2002
    Messages : 733
    Points : 1 384
    Points
    1 384

    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
    383
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 383
    Points : 169
    Points
    169

    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
    Développeur COBOL et le WE (CSS, PHP, JS et MYSQL)
    Inscrit en
    décembre 2002
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : décembre 2002
    Messages : 733
    Points : 1 384
    Points
    1 384

    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
    383
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 383
    Points : 169
    Points
    169

    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 Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 035
    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 035
    Points : 9 440
    Points
    9 440

    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
    383
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 383
    Points : 169
    Points
    169

    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 Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 035
    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 035
    Points : 9 440
    Points
    9 440

    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
    383
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 383
    Points : 169
    Points
    169

    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 Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 035
    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 035
    Points : 9 440
    Points
    9 440

    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
    383
    Détails du profil
    Informations forums :
    Inscription : février 2009
    Messages : 383
    Points : 169
    Points
    169

    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
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

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

    Informations forums :
    Inscription : décembre 2014
    Messages : 26
    Points : 53
    Points
    53

    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD14] Nombre de mot dans une phrase
    Par ecoinfo dans le forum WinDev
    Réponses: 6
    Dernier message: 27/01/2010, 01h19
  2. Limiter le nombre d'occurrences dans une dimension
    Par klognos dans le forum Cognos
    Réponses: 1
    Dernier message: 01/06/2008, 00h29
  3. Réponses: 2
    Dernier message: 07/05/2007, 00h43
  4. Determiner le nombre de majuscules dans une phrase
    Par cirtey dans le forum Général Algorithmique
    Réponses: 5
    Dernier message: 02/03/2007, 10h36
  5. Nombre de 'e' dans un phrase
    Par skulled dans le forum C
    Réponses: 25
    Dernier message: 03/01/2007, 15h54

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