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

Langage SQL Discussion :

[mysql] pb requete


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 24
    Points : 18
    Points
    18
    Par défaut [mysql] pb requete
    je dispose d'une base de gestion d'un (petit) effectif afin de calculer le temps de présence de chacun.

    pour faire simple, on va dire que j'ai une table des effectifs (t_membre), une table des membres présents et une table des remplacants.

    principe: des membres sont titulaires, d'autres ont remplaçants et les remplaçants peuvent remplacer les membres titulaires ...

    je voudrais compter le nb de fois (par jour) où des membres sont titulaires puis remplaces (ce que j'arrive à faire), puis le nb de fois où des remplaçants remplacent les titulaires (j'arrive aussi à faire) et le nb de fois où les titulaires ne son jamais remplacés (ça j'arrive pas à faire...).

    # phpMyAdmin MySQL-Dump
    # version 2.2.6
    # http://phpwizard.net/phpMyAdmin/
    # http://www.phpmyadmin.net/ (download page)
    #
    # Serveur: localhost
    # Généré le : Mardi 16 Novembre 2004 à 23:28
    # Version du serveur: 3.23.49
    # Version de PHP: 4.2.0
    # Base de données: `effectif`
    # --------------------------------------------------------

    #
    # Structure de la table `t_gestion`
    #

    DROP TABLE IF EXISTS `t_gestion`;
    CREATE TABLE `t_gestion` (
    `id_gestion` mediumint(8) unsigned NOT NULL default '0',
    `id_membre` mediumint(8) unsigned NOT NULL default '0',
    `etat` enum('titulaire','remplacant') NOT NULL default 'titulaire',
    PRIMARY KEY (`id_gestion`,`id_membre`)
    ) TYPE=MyISAM;

    #
    # Contenu de la table `t_gestion`
    #

    INSERT INTO `t_gestion` (`id_gestion`, `id_membre`, `etat`) VALUES (1, 1, 'titulaire'),
    (1, 2, 'titulaire'),
    (1, 3, 'titulaire'),
    (1, 4, 'remplacant'),
    (1, 5, 'remplacant'),
    (2, 1, 'titulaire'),
    (2, 2, 'titulaire'),
    (2, 3, 'remplacant'),
    (2, 4, 'remplacant'),
    (3, 2, 'titulaire'),
    (3, 4, 'remplacant'),
    (3, 5, 'remplacant'),
    (4, 1, 'titulaire'),
    (4, 2, 'titulaire'),
    (4, 3, 'remplacant'),
    (4, 4, 'remplacant'),
    (4, 5, 'remplacant');
    # --------------------------------------------------------

    #
    # Structure de la table `t_membre`
    #

    DROP TABLE IF EXISTS `t_membre`;
    CREATE TABLE `t_membre` (
    `id_membre` mediumint(8) unsigned NOT NULL auto_increment,
    `nom_membre` varchar(30) NOT NULL default '',
    PRIMARY KEY (`id_membre`)
    ) TYPE=MyISAM;

    #
    # Contenu de la table `t_membre`
    #

    INSERT INTO `t_membre` (`id_membre`, `nom_membre`) VALUES (1, 'david'),
    (2, 'sebastien'),
    (3, 'nicolas'),
    (4, 'etienne'),
    (5, 'maurice');
    # --------------------------------------------------------

    #
    # Structure de la table `t_remplacement`
    #

    DROP TABLE IF EXISTS `t_remplacement`;
    CREATE TABLE `t_remplacement` (
    `id_remplacement` mediumint(8) unsigned NOT NULL auto_increment,
    `id_membre_remplace` mediumint(8) unsigned NOT NULL default '0',
    `id_membre_remplacant` mediumint(8) unsigned NOT NULL default '0',
    `id_gestion` mediumint(8) unsigned NOT NULL default '0',
    PRIMARY KEY (`id_remplacement`)
    ) TYPE=MyISAM;

    #
    # Contenu de la table `t_remplacement`
    #

    INSERT INTO `t_remplacement` (`id_remplacement`, `id_membre_remplace`, `id_membre_remplacant`, `id_gestion`) VALUES (1, 2, 5, 1),
    (2, 1, 5, 4),
    (3, 2, 4, 4);

    ainsi par exemple:

    select nom_membre, g.id_membre, count(*) as c
    from t_gestion g inner join t_remplacement r on g.id_gestion=r.id_gestion, t_membre m
    where

    g.etat='titulaire'
    and m.id_membre=g.id_membre
    and m.id_membre=r.id_membre_remplace
    group by g.id_membre
    me donne:

    nom_membre || id_membre || c
    david-------------------1--------------1
    sebastien--------------2---------------2
    pour les besoins, j'ai simplifié les choses et la base (j'espère pas trop !) et limité les données (j'espère ici pas trop non plus).

    je n'arrive pas à ressortir le nb d'occurence de chauqe membre lorsqu'il est titulaire mais non remplacé, soit ici:

    nom_membre || id_membre || c
    david-------------------1--------------3
    sebastien--------------2-------------- 2
    nicolas-----------------3--------------1
    etienne---------------- 4--------------0
    maurice----------------5--------------0
    PS: je ne sais pas si on aurait pu effectuer une jointure reflexive, les champs id_membre_remplace et id_membre_remplacant sont redondants en fait ...

    voila, si qq'un peut m'aider à résoudre cela :o

    Merci

  2. #2
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    nom_membre || id_membre || c
    david-------------------1--------------3
    sebastien--------------2-------------- 2
    nicolas-----------------3--------------1
    etienne---------------- 4--------------0
    maurice----------------5--------------0

    je n'arrive pas à ressortir le nb d'occurence de chauqe membre lorsqu'il est titulaire
    etienne et maurice ne sont pas titulaire, pourquoi apparaisent il dans ton resultat.

    mais non remplacé
    David et sébastien ont été remplacés, pourquoi aussi ils apparaissent dans ton resultat.

    Un peu plus clair sur l'expression de ce que tu veux obtenir exactement, nous aiderons à t'orienter.

    A+

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    oui, effectivement la fin de mon explication était moins claire. Je vais essayer donc de repréciser le tout. Je cherche à obtenir le nombre d'occurences (noté ici c) où le nombre est titulaire et non remplacé (pour le même id_gestion).

    Ex: le membre sebastien (id_membre: 2) dans t_gestion apparait 4 fois comme titulaires (id_gestion: 1, 2, 3 et 4). Dans t_remplacement: pour les id_gestion 1 et 4, le meme sébastien est remplacé par Maurice, puis par Etienne dans le second enregistrement. Pour les id_gestion 2 et 3, il n'est pas remplace (on ne retrouve pas pour ces id_gestion, un id_membre_remplacé=2 dans t_remplacement).

    Il y a donc eu deux fois où il était titulaire et où il n'a pas été remplacé.

    le résultat attendu est donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    nom_membre   id_membre     count
    david                1             2
    sebastien          2             2
    nicolas             3             1
    (pour info, on a les liens suivant:

    t_gestion.id_gestion=t_remplacement.id_gestion

    t_remplacement.id_membre_remplace = t_membre.id_membre
    t_remplacement.id_membre_remplacant = t_membre.id_membre

    )

    Effectivement, les id_membre 4 et 5 ayant une occurence de zéro ne doivent pas paraitre dans le résultat final.

    J'espère avoir été plus clair, sinon je repréciserais encore .
    Merci d'avance.

  4. #4
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    Essaies ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select nom_membre, g.id_membre, count(*) as c 
    from t_membre m  left inner join t_gestion g 
    ON m.id_membre=g.id_membre 
    left outer  t_remplacement r 
    on r.id_membre_remplace=m.id_membre
    and g.id_gestion=r.id_gestion 
    where g.etat='titulaire' 
    and r.id_membre_remplace is null 
    group by nom_membre,g.id_membre
    A+

  5. #5
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Un INNER en moins, un JOIN en plus et la syntaxe sera bonne

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2003
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 24
    Points : 18
    Points
    18
    Par défaut
    Oui, comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select nom_membre, g.id_membre, count(*) as c 
    from t_membre m left join t_gestion g 
    ON m.id_membre=g.id_membre 
    left outer join t_remplacement r 
    on r.id_membre_remplace=m.id_membre 
    and g.id_gestion=r.id_gestion 
    where g.etat='titulaire' 
    and r.id_membre_remplace is null 
    group by nom_membre,g.id_membre
    Un grand merci à tous les deux pour cette aide précieuse. Tout marche impeccable, je vais essayer de transposer cela à mon cas réel (puisque ici j'ai simplifié un peu le tout), mais je suis sur que cela ne posera pas de problème. C'est vrai qu'avec mysql il n'est pas tjrs évident d'ecrire sa requete dans certains cas.

    Merci encore pour le tout !

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

Discussions similaires

  1. [MySQL] Sous requête EXISTS
    Par Legenyes dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/07/2006, 12h04
  2. [Access][Mysql]plusieures requetes en une seule
    Par Gwenved dans le forum Langage SQL
    Réponses: 1
    Dernier message: 05/05/2006, 12h10
  3. Réponses: 4
    Dernier message: 26/04/2006, 14h36
  4. [MySQL] Sous-requête renvoyant plus d'un enregistrement
    Par altadeos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/04/2006, 11h33
  5. Interclassement MySql et requete Like
    Par Sylvain245 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/01/2006, 14h23

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