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 :

Compter sur plusieurs colonnes d'une table, indépendamment des autres entrées sur la ligne


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Compter sur plusieurs colonnes d'une table, indépendamment des autres entrées sur la ligne
    Bonsoir,

    Je suis à la recherche d'une solution pour compter le nb d'entrées dans une base à plusieurs colonnes, mais que le comptage soit indépendant des autres entrées de la ligne... ?

    Concrètement une table liste_action :

    id - user - action1 - action2 - action3
    1 - john - manger - boire - dormir
    2 - paul - manger - rever - ecrire
    3 - Leo - boire - ecrire - manger

    1) Quelle requête donnerait comme résultat ?

    manger - 3
    boire - 2
    dormir - 1
    rever - 1
    ...
    ...

    2) Quelle requête pourrait donner des résultats en % ?

    manger - 33%
    Boire - 22%
    Dormir - 11%
    Rever - 11%
    ...
    ...


    Merci pour votre aide et bonne nuit
    Jo.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    Mauvaise modélisation.

    Il vous faut une table action qui regroupe toutes les actions possibles, une table utilisateur et une table associative qui aura comme cardinalité n, n entre les deux tables.

    Ensuite un simple COUNT(*) associé à un GROUP BY permettra de réaliser votre requête.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut merci pour l'aide
    J'ai essayé une syntaxe de ce genre, mais le résultat obtenu ne comptait que les triples informations identiques...
    Si je reprends mon exemple, ça ne comptait que :
    manger - boire - dormir / 1
    manger - rever - ecrire / 1

    et non
    manger - 3
    boire - 2
    dormir - 1
    rever - 1
    ...
    ...

    Mais je peux bien sûr m'être trompé en écrivant.
    Pourriez-vous me donner + d'information sur votre solution tout en vérifiant si elle prend bien en compte le comptage dans les 3 colonnes indépendamment de la ligne.

    Merci.
    Jo.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Deux solutions,

    la première ignoble qui ne permet aucune modification de vos tables :
    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
    SELECT tmp.nomAction, SUM(tmp.compte)
    FROM (
    	SELECT action1, COUNT(*)
    	FROM liste_action
    	GROUP BY action1
    	UNION ALL
    	SELECT action2, COUNT(*)
    	FROM liste_action
    	GROUP BY action2
    	UNION ALL
    	SELECT action3, COUNT(*)
    	FROM liste_action
    	GROUP BY action3
    ) tmp
    GROUP BY tmp.nomAction;
    Je pense que cette requête fonctionne.

    Ensuite la vraie solution est de revoir la modélisation de vos tables.
    Une table action avec deux colonnes : idAction en clé primaire et nomAction en VARCHAR.
    Ensuite une table user avec toutes les colonnes que vous souhaitez.
    Finalement une table associative action_user avec deux colonnes : idAction et idUser, idAction est une clé étrangère sur la table action et idUser est une clé étrangère sur la table user.

    Pour votre requête, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nomAction, COUNT(*)
    FROM action_user
    INNER JOIN action ON action_user.idAction = action.idAction
    GROUP BY nomAction

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 039
    Points : 23 787
    Points
    23 787
    Par défaut
    Sans compter que le jour où vous souhaitez enregistrer plus d'actions par user, vous allez faire comment ? Ajouter de nouvelles colonnes à chaque fois ? Et modifier vos requêtes en conséquence ?
    Alors qu'avec le modèle proposé par Exia93, pas besoin de changer la structure de vos tables, ni vos requêtes d'ailleurs.

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Merci, j'avance...
    Merci pour les infos.

    Je récapitule, ça me permet également d'ordonner mes idées.

    J'ai créé sous ma base MySQL 2 tables :

    Une table ACTION
    avec idaction as PRIMAIRE et nomaction

    Une table USER
    avec iduser as PRIMAIRE , Action1, Action2, Action3

    Ces 2 tables ont un Engine InnoDB

    J'ai créé une 3ème table ACTION_USER (également en InnoDB)
    avec idaction => lié à idaction de la table action
    iduser => lié à iduser de la table user

    J'espère avoir bon jusque là mais quand je tente la requête fournie par Exia93 j'obtiens un résultat vide.

    ?? merci d'avance
    Jo.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Avez-vous bien rempli vos tables ?

  8. #8
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Je pense ...
    Bonjour,
    J'ai rempli les tables comme ci-après:

    - Table 'action'
    idAction - nomAction
    1 - Manger
    2 - Dormir
    3 - Rever
    4 - Boire

    - Table 'user'
    iduser - action1 - action2 - action3
    1 - 1 - 2 - 3 => user 1 aime Manger, Dormir et Rever
    2 - 4 - 3 - 1
    3 - 1 - 4 - 2

    - Table 'action_user'
    idaction => lié à idaction de la table action
    iduser => lié à iduser de la table user

    Cette table associative se remplit automatiquement ?
    Actuellement elle est vide.

    Merci beaucoup pour votre aide.
    Jo.

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Vous n'avez donc pas compris la modélisation que je vous propose.

    Votre schéma doit ressembler à :
    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
    - Table 'action'
    idAction - nomAction
    1 - Manger
    2 - Dormir
    3 - Rever
    4 - Boire
     
    - Table 'user'
    iduser - nomUser
    1 - Toto
    2 - Titi
    3 - Tutu
     
    - Table 'action_user'
    1 - 1
    1 - 2
    1 - 3
    2 - 4
    2 - 3
    2 - 1
    3 - 1
    3 - 4
    3 - 2

  10. #10
    Membre averti
    Avatar de diablo-dz
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 75
    Points : 327
    Points
    327
    Par défaut
    bonsoir à vous
    les règles de gestion que tu décris sont :
    1- un user peut avoir une ou plusieurs actions
    2- une action est faite par un ou plusieurs users

    Car le modèle relationnel offre une solution universelle de modélisation d’une association de type N-N entre deux tables ; celle-ci consiste à créer une troisième table qui est la relation entre les deux contenant 2 attributs de type clé étrangères. Ces 2 attributs de type clé étrangère représentent généralement la clé primaire de la nouvelle relation, et c’est l’exemple de solution juste proposée par Exia93 ci-dessus.

    Tu va avoir le schéma proposée par Exia93 ci-dessus.

    A+

  11. #11
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut ca y est ...
    Oui je n'avais pas la bonne logique.

    Ça fonctionne, mais il me reste encore quelques questions relatives à la saisie et à la modification de la table associative.

    1) création
    Comment gérer la création d'entrées dans cette table grâce à des infos rentrées sur un site avec des menus déroulants ?

    J'identifie le nom du user avec ma variable Session.

    Je cherche le idUser correspondant au nom dans la base user.

    Je crée n nombres de lignes avec iduser correspondant à n actions ?

    2) modification
    Comment gérer la modification d'entrées dans cette table grâce à des infos rentrées sur un site avec des menus déroulants ?

    J'identifie le nom du user avec ma variable Session.

    Je cherche le idUser correspondant au nom dans la base user.

    Je recherche les entrées existantes, je les efface et crée n nombres de lignes avec iduser correspondant à n action ? / ou puis-je modifier les actions existantes ?

    Encore Merci.
    Jo.

  12. #12
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Il suffit de récupérer les id des Actions et des Utilisateurs à gérer.

    Ajout :
    Toto, ayant l'id 1 dans votre BDD, effectue l'action Dormir, ayant pour id 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- En connaissant les ID
    INSERT INTO action_user VALUES
    (1, 1);
     
    -- Sans connaitre les ID
    INSERT INTO action_user VALUES
    ((SELECT idUser FROM user WHERE nomUser = 'Toto'), (SELECT idAction FROM action WHERE nomAction = 'Dormir'));
    Suppression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    -- En connaissant les ID
    DELETE FROM action_user
    WHERE idUser = 1 AND idAction = 1;
     
    -- Sans ID
    DELETE FROM action_user
    WHERE idUser = (SELECT idUser FROM user WHERE nomUser = 'Toto') AND idAction = (SELECT idAction FROM action WHERE nomAction = 'Dormir');
    Modification :
    Cette action n'a pas de sens, car si l'utilisateur ne dort plus mais qu'il court, il suffit de faire une suppression puis un ajout.

    Bien sûr, il est possible de faire des ajouts multiples et suppressions multiples à l'aide de jointures, opérateur IN et autres joyeusetés du SQL ^^.

    EDIT : Pour les users, attention à ne bien récupérer qu'une seule ligne lors de la rechercher dans la table user, pour ça il faut utiliser une donnée unique pour chaque User (id, email, ...)

  13. #13
    Candidat au Club
    Homme Profil pro
    Ingénieur commercial
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur commercial

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut MERCI !!
    MERCI pour votre aide.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/10/2014, 12h34
  2. [WD16] Recherche sur plusieurs colonnes d'une table
    Par WDKyle dans le forum WinDev
    Réponses: 2
    Dernier message: 04/06/2012, 13h17
  3. [2.5.2] Table sur plusieurs colonnes dans une page
    Par Kobe Horserider dans le forum BIRT
    Réponses: 2
    Dernier message: 17/08/2010, 15h23
  4. primary key sur plusieurs colonnes d'une table
    Par hotttttsauce dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/04/2008, 12h20
  5. Recherche dans plusieurs colonnes d'une table
    Par yoline dans le forum Access
    Réponses: 4
    Dernier message: 26/07/2006, 11h58

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