Requête sql select

Résolu
okbabb Messages postés 57 Date d'inscription   Statut Membre Dernière intervention   -  
heliconius Messages postés 539 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

table "employe" :

ID nom
1 Michel
2 David
3 Natalie

table "grades" :

id_grade nom_grade
1 Adjudant
2 Adjudant-chef
3 Lieutenant
4 Capitaine
5 Commandant
6 Colonel

table "grades_employes" :

id_grade_employe id_grade date_grade ID
1 1 2020-01-01 1
2 3 2020-01-01 2
3 5 2020-01-01 3
4 2 2022-01-01 1
5 4 2022-01-01 2
6 6 2022-01-01 3

J'ai essayé de faire une liste des employes avec grade (chacun son "date_grade" le plus récent) comme suit:

nom nom_grade
Michel Adjudant-chef
David Capitaine
Natalie Colonel

Mon code:

SELECT nom,nom_grade
FROM employes,grades,grades_employes
WHERE grades.id_grade=grades_employes.id_grade AND (SELECT MAX(date_grade) FROM grades_employes WHERE grades_employes.ID=employes.ID AND grades.id_grade=grades_employes.id_grade)


Mais je n'arrive pas à résoudre cette requête
Merci.

4 réponses


 
Bonjour,

Tu n'as pas de message d'erreur ?
Il me semble qu'il manque des choses : tu as un from avec 3 tables, tu devrais avoir 2 conditions entre ces 3 tables, il manque la condition entre employes et grades_employes, puis avant ton sous select, tu devrais avoir un nom de champ
AND grades_employes.date_grades = (select


0
okbabb Messages postés 57 Date d'inscription   Statut Membre Dernière intervention  
 
non, il n'ya pas de message d'erreur, mais la requête donne le résultat faux suivante:

nom nom_grade
Michel Adjudant
David Lieutenant
Natalie Commandant
Michel Adjudant-chef
David Capitaine
Natalie Colonel
0
okbabb Messages postés 57 Date d'inscription   Statut Membre Dernière intervention  
 
Merci jee pee, c'est bon, le problème est résolu
0
heliconius Messages postés 539 Date d'inscription   Statut Membre Dernière intervention   142
 
Bonjour,

j'essaye de résumer avec mes mots (je reconnais avoir du mal quand le nom des tables et des champs ne correspondent pas à la réalité. Mais ça ne regarde que moi). En clair, si j'ai bien compris, en Merise ça donnerait le MCD :
[Employé]--1,n-----(avoir)-----0,n--[Grade]


Cardinalités :
-- côté employé = 1,n : tout employé a au minimum 1 grade mais peut en avoir eu plusieurs
-- côté grade = 0,n : un grade peut ne pas être attribué mais peut l'être plusieurs fois (0 général mais plusieurs adjudants)

Selon moi, je modéliserais ainsi (désolé, j'ai toujours évité les noms de champ à rallonge: ça complique la lecture et c'est générateur d'erreurs et j'évite les accents) Les clefs primaires sont soulignées :
Employes (ide, nom, prenom)
Grades (idg, grade)
Avoir (ide, idg, dprom)


NB: dprom = date promotion

Ma requête serait la suivante :

SELECT grade, nom, prenom, dprom
 FROM Employes, Avoir, Grades
WHERE Employes.ide=Avoir.ide
  AND Grades.idg=Avoir.idg
ORDER BY dprom DESC;



ORDER :
ORDER BY nom,prenom,dprom DESC; 
// ordre alpha des noms, prenom avec leur dates décroissantes de promotion pour chacun
ORDER by dprom DESC,nom,prenom;
// De la promotion la plus récente à la plus ancienne et pour une même date par nom, prenom
0