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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    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 éclairé
    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
    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 : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    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 éclairé
    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
    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 : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    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 !

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