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 les noms absents d'une table en regroupant par type


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut compter les noms absents d'une table en regroupant par type
    Bonsoir, voila quelques heure que je ne trouve pas la solution a mon problème, j'ai deux tables,

    la première PERSONNELS dont voici une partie de la structure:
    grade (varchar)
    nom (varchar)
    prenom (varchar)
    matricule (int)
    centre (int)

    la deuxième POINTAGE dont voici une partie :
    sp (varchar) (contient la concaténation de grade, nom, prenom, matricule de la table PERSONNELS)
    fma (varchar) (contient les données d'une autre table)

    j'avais besoin d'une requête qui me dise combien de personne on effectuer chaque fma pour ce faire j'ai crée cette requête qui fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT fma, COUNT(DISTINCT sp) AS nbre FROM pointage WHERE sp IN (SELECT CONCAT(personnels.grade,' ', personnels.nom,' ', personnels.prenom,' (', personnels.matricule,')') FROM personnels where personnels.centre = '$lecentre') GROUP BY fma"
    mais a présent j'ai besoin de savoir combien de personnes non PAS effectuer chaque fma !
    et la je bloque j'ai essayé avec 'NOT IN' mais ma requête ne me retourne rien !!

    pour etre plus explicite voir un exemple, dans personnel j'ai :
    PIERRE
    ALAIN
    MARC

    dans pointage j'ai :
    PIERRE - FMA RCP
    ALAIN - FMA DFE
    PIERRE - FMA RCP

    ainsi la requête que j'ai crée me renvoi :
    FMA RCP 1
    FMA DFE 1

    et ce que je souhaite c'est que la seconde requête me renvoi :
    FMA RCP 2 (car marc et alain ne l'on pas faite)
    FMA DFE 2 (pierre et marc ne l'on pas faite)

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Et vous en êtes où du développement de l'appli ?

    Car là le mieux à faire serai de reprendre la conception du projet de A à Z.

    Des concaténations de colonne d'autre table dans une nouvelle colonne signifie qu'il vous manque.. des tables d'associations pour faire vos pointages...

    Et les requêtes seraient du coup beaucoup plus simple à réaliser que l'usine à gaz que vous êtes en trein de faire !

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Je suis au début, mais que voulais vous dire par table d'associations ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Je ne connais pas le fonctionnel vu que vous l'avez pas présenté mais un exemple :

    déjà une entité des grades où vous allez référencer les différents grade possible :
    grade(gra_nom, gra_description)

    Ensuite une entité personnel que l'on va associé à l'entité des grades :
    Personnel-1,1----Possede-----0,n-Grade

    Passage MPD :
    t_grade_gra(gra_id, gra_nom, gra_description)
    t_personnel_per(per_id,#gra_id, per_nom, per_nprenom,...)


    Concernant le pointage, dans votre table actuel vous avez 2 colonnes, une pour représenter une personne et l'autre je ne sais pas.
    On va dire pour l'exemple que l'autre est un lieu :
    - une personne peut pointer dans un ou plusieurs lieu
    - un lieu peut être associé à plusieurs personne

    Niveau MCD :
    Personnle-0,n-------Pointe-------0,n-Lieu

    Passage MPD :
    t_personnel_per(per_id,#gra_id, per_nom, per_nprenom,...)
    t_lieu_lie(lie_id, lie_nom, lieu_description)
    a_per_lie(#per_id, #lie_id)


    Ok, maintenant pour le besoin :
    -chercher toutes les personnes ayant déjà pointé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
    from t_personnel_per per
    where exists (select 1 from a_per_lie a where a.per_id = per.per_id);

    -Chercher toutes les personnes n'ayant pas pointé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
    from t_personnel_per per
    where not exists (select 1 from a_per_lie a where a.per_id = per.per_id);

    Avec telle méthode (la base de la conception), vous évitez par rapport à votre modèle existant :
    - redondance des données : gain de place, requête plus performante, etc
    - simplification des requêtes : vous ne travaillez plus qu'avec des clef primaires / clef étrangère => gain de perf, meilleur lisibilité du code, etc

  5. #5
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    ok, j'ai donc revu les structure de mes tables,

    voici pour la table personnels :
    id_pers (int, auto incrémenté)
    pers_nom (varchar)
    pers_prenom (varchar)
    pers_grade (pointe sur l'id de la table grade)
    pers_matricule (varchar)
    pers_centre (pointe sur l'id de la table centre)

    voici ma table manœuvres qui recense les manœuvres que le personnel peut faire :
    id_fma (int, auto incrémenté)
    fma_libelle (varchar)

    et enfin ma table pointage qui recense les manœuvres que le personnel à fait à une date précisé :
    id_pointer (int, auto incrémenté)
    pointer_sp (pointer sur l'id de la table personnels)
    pointer_fma (pointe sur l'id de la table manœuvre)
    pointer_date (date de la réalisation)

    Ainsi j'ai pu faire facilement créer une requête qui permet de compter pour chaque manœuvres le nombre de personne l'ayant réalisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT manoeuvres.fma_libelle AS NomFMA, COUNT( DISTINCT pointage.pointer_sp ) AS nbre
    FROM pointage
    INNER JOIN manoeuvres ON pointage.pointer_fma = manoeuvres.id_fma
    WHERE pointage.pointer_sp
    IN (SELECT personnels.id_pers FROM personnels)
    GROUP BY pointage.pointer_fma
    Maintenant punkoff j'ai essayé avec ta méthode NOT EXISTS, et NOT IN, mais la 0 enregistrements, alors que j'ai bien des personnes qui n'ont pas effectuer les manœuvres !
    donc voyer vous une erreur dans ma requêtes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT manoeuvres.fma_libelle AS NomFMA, COUNT( DISTINCT pointage.pointer_sp ) AS nbre
    FROM pointage
    INNER JOIN manoeuvres ON pointage.pointer_fma = manoeuvres.id_fma
    WHERE pointage.pointer_sp
    NOT IN (SELECT personnels.id_pers FROM personnels)
    GROUP BY pointage.pointer_fma

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    sans exemple non, il faudrai donner un jeu de donnée d'entrée et le résultat voulu

    edit: enfin ceci dit, là vous recherchez les manoeuvres qui n'ont été faites par personne et non les personnes qui n'ont fait strictemetn aucune manoeuvre !

  7. #7
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    ok, exemple dans personnels j'ai :

    COCA marc
    PERRIER Jean

    dans manœuvres j'ai :

    SAUVETAGE EN MER
    HÉLIPORTAGE
    ABORDAGE AU PORT

    dans pointage j'ai :

    COCA marc | SAUVETAGE EN MER | 26/03/2012
    COCA marc | SAUVETAGE EN MER | 22/01/2012
    COCA marc | ABORDAGE AU PORT | 12/02/2012
    COCA marc | HELIPORTAGE | 10/02/2012
    PERRIER Jean | HELIPORTAGE | 24/03/2012

    je souhaite donc ceci (nombres de manœuvres non réalisés)
    SAUVETAGE EN MER | 1 personnes
    HÉLIPORTAGE | 0 personnes
    ABORDAGE AU PORT | 1 personnes

    Voila, merci pour votre aide

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    Je pense qu'on peut trouver mieux comme requête mais une piste ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select a.id_fma, a.fma_libelle , (select count(*) from personnels) - count(distinct b.pointer_sp) as cnt 
    from manoeuvre a
    left outer join pointage b on a.id_fma = b.pointer_fma
    group by a.id_fma, a.fma_libelle

  9. #9
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    merci c'est déjà une belle piste !
    Sympa de votre part

  10. #10
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    Je reviens sur cet requêtes car j'ai un petite question, ou plutôt a ajout a faire, en effet je souhaite connaitre le nom des manœuvres qui n'ont pas été effectué mais pour une ville donné (dans la table personnels j'ai rajouter un champ 'id_centre')

    j'ai donc rajouter les conditions sur id_centre dans les 2 counts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a.id_fma, a.fma_libelle , (SELECT count(*) FROM personnels WHERE personnels.pers_centre =1) - count(DISTINCT b.pointer_sp INNER JOIN 
    personnels ON b.pointer_sp=personnels.id_pers WHERE personnels.pers_centre=1) AS cnt 
    FROM manoeuvre a
    LEFT OUTER JOIN pointage b ON a.id_fma = b.pointer_fma
    GROUP BY a.id_fma, a.fma_libelle
    Mais Mysql me renvoi une erreur de synthaxe !! est ce du au fait que dans le second count que je soustrait, j'ai rajouter une jointure ?

  11. #11
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2007
    Messages : 758
    Points : 279
    Points
    279
    Par défaut
    C'est bon j'ai trouvé mais reste un dernier petit point ;
    voila ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT CONCAT( manoeuvres.fma_module, ' - ', manoeuvres.fma_libelle ) AS Nom, 
    ((SELECT count( * )FROM personnels WHERE personnels.pers_centre =5) - COUNT( DISTINCT pointage.pointer_sp ))AS nbreNonValide
    FROM pointage
    INNER JOIN manoeuvres ON pointage.pointer_fma = manoeuvres.id_fma
    WHERE pointage.pointer_sp
    IN (
    SELECT personnels.id_pers
    FROM personnels
    WHERE personnels.pers_centre =5
    )
    GROUP BY pointage.pointer_fma
    Le soucis est les nom des FMA ne s'affiche que pour celle deja enregistré dans la table pointage, alors que je voudrais afficher touts les manoeuvre présente dans la table manoeuvre, j'ai pensé a faire un LEFT OUTER JOIN mais rien n'y change !

Discussions similaires

  1. Compter les fils indirects d'une table
    Par santana2006 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/07/2010, 18h09
  2. [MySQL] Compter les lignes "NULL" d'une table
    Par Budy123 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/03/2010, 12h05
  3. [MySQL] Afficher les noms manquants d'une table
    Par gastoncs dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/10/2009, 09h29
  4. Compter les differents element d'une table
    Par FlyByck dans le forum SQL
    Réponses: 1
    Dernier message: 10/12/2007, 09h17
  5. Réponses: 9
    Dernier message: 04/04/2007, 12h01

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