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 :

Requête ou script PHP ?


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Requête ou script PHP ?
    Bonsoir,

    J'ai un petit soucis,

    J'ai les tables suivantes :
    • Membre [Id_Membre(pk);Nom;Prénom]
    • Grade [Id_grade(pk);Abréviation;Id_hier]
    • Obtient-grade [Id_membre(pk);Id_grade(pk);date_grade]

    Id_hier contient les valeurs suivantes : 1 pour hommes du rang, 2 pour sous officiers, 3 pour officiers.

    Je veux créer un état avec d'abord les officiers; puis 1 autres avec les sous officiers et enfin un dernier avec les hommes du rangs.

    J'exécute la requête suivante (en faisant varier Id_hier )
    Code SQL : 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
    SELECT DISTINCT g.abreviation
    , m.nom
    , m.prenom
    , m.matricule 
    FROM 
          membre m
          , grade g
          , obtient_grade og 
    WHERE 
          g.id_hier = 2 
    AND 
          g.id_grade = og.id_grade 
    AND 
          og.id_membre = m.matricule =  m.id_status = 1 
    ORDER BY 
         g.abreviation
         , m.nom

    Et voilà mon problème, si un membre à changer de grade il va apparaître plusieurs fois dans la table obtient-grade donc je vais le retrouver plusieurs fois dans ma requête.

    Comment faire pour ne garder que le dernier changement dans le résultat de ma requête ?

    Par avance merci pour votre aide.

  2. #2
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonsoir,

    Je savais que MySQL était tordu mais vous êtes sûr qu'il accepte ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    og.id_membre = m.matricule =  m.id_status = 1
    Si vous aviez commencez par normaliser vos jointures et proposer un code propre.....


    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Bonjour Chtulus,

    Pour la requête tu as effectivement raison (au passage elle fonctionne néanmoins). Il faut plutôt lire:
    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
    SELECT DISTINCT g.abreviation
    , m.nom
    , m.prenom
    , m.matricule 
    FROM 
          membre m
          , grade g
          , obtient_grade og 
    WHERE 
          g.id_hier = 2 
    AND 
          g.id_grade = og.id_grade 
    AND 
          og.id_membre = m.matricule 
    AND
          m.id_status = 1 
    ORDER BY 
         g.abreviation
         , m.nom
    Concernant la normalisation, la BDD n'a pas été conçu par mes soins, mais par une stagiaire. J'essai de l'adapter pour mieux répondre à nos besoins.
    Je ne me suis pas encore penché sur la normalisation, mais au vue des tutos je pense que je vais m'y atteler progressivement.
    Il faut par contre que je sois vigilant à l’incidence de la modification de la base dans le fonctionnement global. En tout cas merci pour les conseils.

  4. #4
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour Maverick57,

    Pas de soucis pour la Base de Données, je sais ce que c'est

    Je parlais de vos jointures :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT g.abreviation 
    , m.nom 
    , m.prenom 
    , m.matricule  
    FROM
    membre m
    INNER JOIN obtient_grade og
    ON m.matricule = og.id_membre
    INNER JOIN grade g
    ON og.id_grade = g.id_grade
    WHERE
    g.id_hier = 2
    AND
    m.id_status = 1
    ORDER BY g.abreviation , m.nom

    Votre soucis c'est donc de garder le dernier grade obtenu ?
    Dans votre Table "obtient_grade", vous avez une Colonne "date_grade".

    Gardez uniquement la plus récente.

    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Bonsoir Chtulus,

    Merci pour votre réponse et pour la normalisation de ma requête.

    J'ai essayé en vain d'utiliser la fonction MAX, mais je n'arrive pas à m'en dépêtrer. Pouvez vous me guider?

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Le dernier, c'est celui pour lequel il n'existe pas de suivant !
    Donc, par exemple :
    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
     
    SELECT DISTINCT 
        g.abreviation 
        , m.nom 
        , m.prenom 
        , m.matricule  
    FROM    membre m
    INNER JOIN obtient_grade og
        ON m.matricule = og.id_membre
    LEFT JOIN obtient_grade ogSuivant
        ON ogSuivant.matricule = og.id_membre
        AND ogSuivant.date_grade > og.date_grade
    INNER JOIN grade g
        ON og.id_grade = g.id_grade
    WHERE    g.id_hier = 2
    AND    m.id_status = 1
    AND ogSuivant.id_membre IS NULL
    ORDER BY       
        g.abreviation      
        , m.nom

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 15
    Points
    15
    Par défaut
    Merci à Chtulus et à aieeeuuuuu pour leur aide

    Ça fonctionne correctement.
    Merci encore pour l'aide et pour les conseils. Grâce à vous j'ai trouvé une solution en ayant beaucoup de conseil, du coup j'ai appris pleins de choses. Il ne reste plus qu'à les appliquer.

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

Discussions similaires

  1. [MySQL] Script PHP avec requête UPDATE
    Par souminet dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/04/2010, 16h02
  2. [SQL] PB requête SQL dans un script php et sous phpmyadmin
    Par badboys46 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 22/06/2007, 11h36
  3. [MySQL] Requête sql dans un script php
    Par ceaser dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/05/2007, 14h01
  4. [SQL] Traitement de plusieurs requêtes .SQL dans un script PHP?
    Par M4x dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/03/2006, 19h59

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