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 :

[SQL] selection en fonction d'un nombre de place dans une table 'historique'


Sujet :

Langage SQL

  1. #1
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut [SQL] selection en fonction d'un nombre de place dans une table 'historique'
    Bonjour,
    j'ai un petit soucis de requête.
    Tout d'abord, voici mes tables :

    PERSONNE(id_personne, nom_personne, prenom_personne)
    MEMBRE(id_personne)
    A_STATUT (id_personne, id_statut, date_statut)
    STATUT (id_statut, nom_statut, nb_place)

    Ce que je veux faire c'est :
    selectionner les dernieres personnes (pour les afficher) (dont la date_statut est maximum) avec un nombre égal au nombre de place du statut..

    En gros j'aimerais si j'ai une place pour un président et 2 places pour ministre avec astatut qui est un historique de tous les presidents et ministres,
    j'aimerais le président avec la plus grande date statut et les 2 ministres avec les date statut maximum.

    Voila mon soucis est surtout d'utiliser le nb place et le max de plusieurs dates en fonction de ce nombre.

    Merci par avance pour vos réponses,
    Cordialement,
    Tid

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Pourriez-vous nous présenter une ébauche de la requête que vous tentez de mettre au point.
    Cela sera plus facile pour la faire évoluer.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Voici le début de la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select max(date_statut), statut.id_statut 
    from personne, membre, a_statut, statut
    where personne.id_personne = membre.id_personne
    and a_statut.id_personne = membre.id_personne
    and statut.id_statut = a_statut.id_statut
    group by  statut.id_statut
    ceci me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    2006-10-10 00:00:00.000	0
    2005-01-01 00:00:00.000	3
    Pour mes 2 statuts j'ai le max de date.
    Puis je maintenant, dans la même requête recupérer le nom et prenom de la personne?
    (on ne s'occupe pas pour l'instant du nombre de place)

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Pour récupérer l'id_personne correspondant à la date la plus récente pour chaque statut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  id_personne
        ,   id_statut
        ,   date_statut
    FROM    a_statut    AS as1
    WHERE   EXISTS
            (   SELECT  1
                FROM    a_statut    AS as2
                WHERE   as1.id_statut = as2.id_statut
                GROUP BY as2.id_statut
                HAVING  as1.date_statut = MAX(as2.date_statut)
            )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Super! ça semble fonctionner.
    Je n'utilise que peu de "Exists"... Bien vu !

    Puis-je pousser le vice?
    Maintenant ce que je souhaiterais, ce serait de prendre en compte le nombre de place nb_place pour chaque statut...
    Je ne sais pas si c'est fesable par requête ou s'il va falloit que je programme...

    Donc par exemple pour le statut "président" : nb_place = 1 , pas de problème...
    pour le statut "vendeur" : nb_place = 3 ! => problème max(date) ne me permet d'obtenir que le dernier id mais j'aimerais les 3 derniers s'il y en a...

    Dans mon développement la personne n'est pas obligé de supprimer les anciens vendeurs ou leur caractéristiques (historique plus complet), elle en ajoute des nouveaux pour avoir "sa nouvelle équipe".

    As-tu une idée?

  6. #6
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Bon j'ai tenté des choses mais ça ne semble pas être possible

  7. #7
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    En programmant c'est super dur aussi puisque il me faudrait quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAX(date_statut) -  1 /* pour obtenir l'avant dernier et celui d'avance...* /
    Pensez vous que c'est réalisable?

Discussions similaires

  1. [SQL] Compter le nombre d'occurences dans une table par valeur
    Par SpaceFrog dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/04/2008, 17h22
  2. [SQL] Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 14/08/2006, 13h28
  3. Réponses: 4
    Dernier message: 11/06/2006, 12h05
  4. Réponses: 8
    Dernier message: 20/06/2005, 15h10
  5. recherche du nombre d'occurences dans une table
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/01/2004, 20h03

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