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 :

Plusieurs COUNT pour plusieurs valeurs dans une même table


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Points : 115
    Points
    115
    Par défaut Plusieurs COUNT pour plusieurs valeurs dans une même table
    Bonjour,

    J'aurais besoin d'aide sur le problème suivant :

    Admettons que j'ai une table "userinfo" dans une base de données MySQL qui comporte les informations suivantes :

    id ------ username ------ groupname
    1 ------ user1 ------ groupe1
    2 ------ user2 ------ groupe2
    3 ------ user3 ------ groupe2
    4 ------ user4 ------ groupe3
    5 ------ user5 ------ groupe3
    6 ------ user6 ------ groupe3

    Il faudrait que je parvienne en une seule requête SQL à avoir :

    1) Le nom de tout les groupes (ça c'est bon c'est "SELECT DISTINCT groupname")
    2) Un COUNT(*) de tout les utilisateurs pour chaque groupe

    Je dois obtenir ceci :
    groupe1 : 1 utilisateur
    groupe2 : 2 utilisateurs
    groupe3 : 3 utilisateurs

    3) Calculer le pourcentage de répartition des users dans les groupes

    J'ai vu qu'il y avait la syntaxe SUM(CASE WHEN X = Y THEN 1 ELSE 0) mais il y a un problème en plus. En temps réel, le point n°1 doit être capable de me dire combien de groupes sont répertoriés car des groupes sont ajoutés dans la base de données de temps en temps. En d'autres termes, je ne devrais pas avoir à renseigner moi-même le groupname, il doit être détecté tout seul.

    Si vous avez une idée ..

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    déjà pour être plus efficace et compact:

    ensuite tu te compliques la vie, ce que tu veux ne serait pas tout simplement:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select groupname, count (distinct username)
    from userinfo
    group by groupname;

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    ensuite tu te compliques la vie, ce que tu veux ne serait pas tout simplement:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select groupname, count (distinct username)
    from userinfo
    group by groupname;
    Cette requête répond à mon point n°2
    Reste le n°3 où il faut que je calcule chaque part en pourcentage directement.

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT groupname, count (DISTINCT username), if(temp.total=0,0,count (DISTINCT username)/temp.total*100)
    FROM userinfo
    cross join(
      select count (DISTINCT username) as total
      FROM userinfo
    ) temp
    GROUP BY groupname;

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Points : 115
    Points
    115
    Par défaut
    Erreur de syntaxe. A quoi correspond le "temp" exactement ? C'est surtout sa présence à la ligne 6 qui me laisse perplexe.

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    tu as bien la dernière version de ma requête car je me suis fait avoir par un appui sur tab qui a envoyé le post incomplet...?

    et donne l'erreur complète... temp un alias obligatoire en cas de sous requête en jointure comme là

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT groupname, count (DISTINCT username), if(temp.total=0,0,count (DISTINCT username)/temp.total*100)
    FROM userinfo
    cross join(
      select count (DISTINCT username) as total
      FROM userinfo
    ) temp
    GROUP BY groupname;
    Cette requête d'après phpMyAdmin contient une erreur près du IF. J'ai même carrément fait un copier/coller pour être sûr et c'est toujours le cas. Je ne dis que ce que je lis.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    J'ajouterais des alias dans le SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT groupname,
    	COUNT(DISTINCT username) AS nb_users,
    	IF(temp.total = 0, 0, (100 * COUNT(DISTINCT username)) / temp.total) AS pourcentage
    FROM userinfo
    CROSS JOIN(
      SELECT count (DISTINCT username) AS total
      FROM userinfo
    ) temp
    GROUP BY groupname;

  9. #9
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    j'ai fait un essai avec ça:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select count(u.User), temp.b
    from mysql.user u
    cross join
    (
    	select count(v.host) as b
    	from mysql.user v
    ) temp;
    ça marche
    comme on est pas loin de l'auto-jointure rajoute un alias pour la table dans la sous-requête et la requête principale, pour voir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT v.groupname, count (DISTINCT v.username), IF(temp.total=0,0,count (DISTINCT v.username)/temp.total*100)
    FROM userinfo v
    CROSS JOIN(
      SELECT count (DISTINCT u.username) AS total
      FROM userinfo u
    ) temp
    GROUP BY v.groupname;

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Points : 115
    Points
    115
    Par défaut
    Pour résumer, ce qui manquait dans ma requête initiale que je n'ai pas posté ici, c'est d'une part le GROUP BY pour la répartition des users, et d'autre part les alias pour la répartition des pourcentages.

    Merci à vous deux, la requête finale fonctionne, le problème est résolu.

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

Discussions similaires

  1. Max pour plusieurs éléments dans une même table
    Par Schwy dans le forum Requêtes
    Réponses: 12
    Dernier message: 07/10/2013, 17h17
  2. Plusieurs valeurs dans une même cellule
    Par biche1 dans le forum Excel
    Réponses: 4
    Dernier message: 25/09/2008, 15h56
  3. Réponses: 5
    Dernier message: 04/06/2008, 10h03
  4. Réponses: 2
    Dernier message: 16/05/2008, 14h43
  5. [Requête] plusieurs champs dans une même table ayants la même source
    Par Christophe93250 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 25/04/2006, 16h18

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