IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Occurences de données dans plusieurs champs


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut Occurences de données dans plusieurs champs
    Bonjour,

    Je souhaite regrouper et trier par nombre d'occurences une table donnée (et non modifiable )

    Voici un exemple :

    CHAMP1 (numéro) CHAMP2 (prénom1) CHAMP3 (prénom2) CHAMP4 (prénom3)
    1 pierre paul marc
    2 jean pierre thierry
    3 marc alain pierre
    4 marc pierre paul

    Avec pour résultat :

    CHAMP1 (nombre occurences) CHAMP2 (prénom)
    4 pierre
    3 marc
    2 paul
    1 jean
    1 thierry
    1 alain

    J'y suis arrivé dans le cas simple d'un seul champ de prénom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT( * ), `prenom` FROM `table` GROUP BY `prenom` ORDER BY 1 DESC
    Mais je bloque sur l'extension à d'autres champs .. faut-il créer une table intermédiaire de regroupement ?

    Merci de vos conseils !

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Comme tu as les prénoms dans 3 colonnes, il faut les réunir en une seule colonne puis grouper et compter sur cette colonne :
    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
    SELECT grp.Prenom, COUNT(*) AS Occurence
    FROM (
      SELECT prenom1 AS Prenom
      FROM taTable
     
      UNION
     
      SELECT prenom2
      FROM taTable
     
      UNION
     
      SELECT prenom3
      FROM taTable
    ) AS grp
    GROUP BY grp.Prenom
    ORDER BY COUNT(*) DESC
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci CinePhil,

    Je comprends l'idée : rassembler les 3 champs en un, dans une table virtuelle, puis grouper, compter et trier ..

    Le resultat de ton code me regroupe effectivement les trois champs, mais n'additionne pas les champs communs. J'ai par exemple :

    pierre 1
    pierre 1
    pierre 1
    pierre 1
    marc 1
    marc 1
    marc 1
    paul 1
    paul 1
    jean 1
    thierry 1
    alain 1

    J'ai essayé de faire un GROUP BY grp.Prenom a l'intérieur du FROM (..) sans succés

    Comment pallier à cette erreur de syntaxe ?
    Merci.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Effectivement il faut utiliser UNION ALL car UNION ne prend pas les doublons.
    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
    SELECT grp.Prenom, COUNT(*) AS Occurence
    FROM (
      SELECT prenom1 AS Prenom
      FROM Prenoms
     
      UNION ALL
     
      SELECT prenom2
      FROM Prenoms
     
      UNION ALL
     
      SELECT prenom3
      FROM Prenoms
    ) AS grp
    GROUP BY grp.Prenom
    ORDER BY COUNT(*) DESC
    Résultat chez moi :
    Prenom / Occurence
    Pierre / 4
    Marc / 3
    Paul / 2
    Alain / 1
    Jean / 1
    Thierry / 1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci

    Au vu du nombre de réponse de la requête, je m'aperçois des coquilles du style : Jean Pierre et Jean-Pierre, René et Rene .. qui distinguent donc des prénoms différents !!

    A moi de traiter la table d'association des champs en remplaçant les '-' et les accents ..

    Sauf que ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT grp.Prenom, COUNT( * )
    FROM (
     
    SELECT REPLACE( Prenom, '-', ' ' )
    FROM (
     
    SELECT `prenom1` AS Prenom
    ...
    ) AS grp )
    et celui-ci génèrent une erreur de synthaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT grp.Prenom, COUNT( * )
    FROM (
     
    UPDATE Prenoms SET prenom1=REPLACE(prenom1,'-',' ') WHERE champ LIKE '%-%'
     
    FROM (
     
    SELECT `prenom1` AS Prenom
    ...
    ) AS grp )
    Est-ce que cette opération est au moins possible après la réunification des tables ?

    Merci

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Tu ne peux pas faire un UPDATE dans un SELECT !

    Quant au premier code, poste la requête en entier qu'on voie ce qui ne va pas.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Tu ne peux pas faire un UPDATE dans un SELECT !
    Faut bien essayer quand on débute

    Voici mon code :

    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
    SELECT grp.Prenom, COUNT( * )
    FROM (
     
    SELECT REPLACE( Prenom, '-', ' ' )
    FROM (
     
    SELECT `prenom1` AS Prenom
    FROM `maTable`
    UNION ALL
    SELECT `prenom2`
    FROM `maTable`
    UNION ALL
    SELECT `prenom3`
    FROM `maTable`
    ) 
    )
     
    AS grp
    WHERE grp.Prenom != ''
    GROUP BY grp.Prenom
    ORDER BY 2 DESC
    Merci

  8. #8
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    grp.Prenom n'existe pas puisque tu n'a pas aliassé la colonne REPLACE( Prenom, '-', ' ' )
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Bonsoir Maljuna Kris,

    Comment "aliasser" la colonne de résultat REPLACE( Prenom, '-', ' ' ) tout en affichant les résultats de "grp.Prenom" ?

    Sachant que ça ne sera pas reproductible si je veux re-créér un remplacement des caractères "é" ..

    Un scritp n'existe-t-il pas ?

    Merci de ton aide

  10. #10
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Comme ceci, par exemple
    Code sql : 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
    SELECT grp.Prenom, COUNT( * )
    FROM ( 
        SELECT REPLACE( Source, '-', ' ' ) AS Prenom
        FROM (
            SELECT `prenom1` AS Source
            FROM `maTable`
            UNION ALL
            SELECT `prenom2`
            FROM `maTable`
            UNION ALL
            SELECT `prenom3`
            FROM `maTable`
            ) 
        )AS grp
    WHERE grp.Prenom != ''
    GROUP BY grp.Prenom
    ORDER BY 2 DESC
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  11. #11
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Hum j'ai l'erreur suivante :

    #1248 - Every derived table must have its own alias


    J'ai essayé cette idée de placer l'alias pour chaque table "unifiée"

    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
    SELECT grp.Prenom, COUNT( * )
    FROM ( 
        SELECT REPLACE( Source, '-', ' ' ) AS Prenom
        FROM (
            SELECT `POL1` AS Source
            FROM `invites`
            UNION ALL
            SELECT `POL2` AS Source
            FROM `invites`
            UNION ALL
            SELECT `POL3` AS Source
            FROM `invites`
            ) 
        )AS grp
    WHERE grp.Prenom != ''
    GROUP BY grp.Prenom
    ORDER BY 2 DESC
    ..même résultat !

    Ne peut-on pas remplacer le caractère choisi dans chaque table avant l'union ?

    Merci

  12. #12
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Every derived table must have its own alias, not every column
    Code sql : 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
    SELECT grp.Prenom, COUNT( * )
    FROM ( 
        SELECT REPLACE( u.Source, '-', ' ' ) AS Prenom
        FROM (
            SELECT `prenom1` AS Source
            FROM `maTable`
            UNION ALL
            SELECT `prenom2`
            FROM `maTable`
            UNION ALL
            SELECT `prenom3`
            FROM `maTable`
            ) AS u
        )AS grp
    WHERE grp.Prenom != ''
    GROUP BY grp.Prenom
    ORDER BY 2 DESC
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  13. #13
    Futur Membre du Club
    Inscrit en
    Décembre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    CA FONCTIONNE !

    Merci Maljuna Kris et CinePhil

    Pensez-vous que je peux multiplier ces "filtres" et les imbriquer ?

    a+

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par dlm64 Voir le message
    Pensez-vous que je peux multiplier ces "filtres" et les imbriquer ?
    Que veux-tu dire par 'filtre' ? Pour moi c'est une requête qui va utiliser la clause WHERE.
    Que veux-tu dire par 'imbriquer' ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  15. #15
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Si ce à quoi tu penses c'est d'imbriquer les fonctions REPLACE, la réponse est oui, c'est possible.
    Quant à savoir si c'est souhaitable....
    Il est vrai que PHP, par exemple, permet d'utiliser des arrays comme arguments de remplacement dans sa fonction str_replace(), mais pas MySQL.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/06/2014, 14h34
  2. [C#] Plusieurs données dans un champ d'un GridView
    Par Marin d'Eau Douce dans le forum ASP.NET
    Réponses: 2
    Dernier message: 28/10/2011, 02h11
  3. Ajouter données dans un champ (concat)
    Par TNorth dans le forum Requêtes
    Réponses: 6
    Dernier message: 09/05/2005, 21h38
  4. Réponses: 7
    Dernier message: 12/10/2004, 16h43
  5. Réponses: 6
    Dernier message: 15/04/2004, 11h04

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