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

jee pee Messages postés 41501 Date d'inscription   Statut Modérateur Dernière intervention   9 711
 
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
jee pee Messages postés 41501 Date d'inscription   Statut Modérateur Dernière intervention   9 711
 
Là on obtient un produit des 3 tables, et tous les grades successifs d'une personne. Cela ne répond pas à la question "son "date_grade" le plus récent"
0
heliconius Messages postés 539 Date d'inscription   Statut Membre Dernière intervention   142
 
Si tu veux faire des tests, voici un jeu d'essai.
-- Table `Employes`

CREATE TABLE `Employes` (
  `ide` integer NOT NULL AUTO_INCREMENT COMMENT 'ID de l''employé',
  `nom` varchar(25) NOT NULL DEFAULT '' COMMENT 'Bom de l''employé',
  `prenom` varchar(25) NOT NULL DEFAULT '' COMMENT 'Prénom de l''employé',
  PRIMARY KEY (`ide`)
) ENGINE=MyISAM COMMENT='Table des employés';

MariaDB [test]> DESC Employes;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| ide    | int(11)     | NO   | PRI | NULL    | auto_increment |
| nom    | varchar(25) | NO   |     |         |                |
| prenom | varchar(25) | NO   |     |         |                |
+--------+-------------+------+-----+---------+----------------+
3 rows in set (0.001 sec)

INSERT INTO `Employes` VALUES (1,'DUPONT','Michel');
INSERT INTO `Employes` VALUES (2,'ANDRE','David');
INSERT INTO `Employes` VALUES (3,'MOREAU','Natalie');

MariaDB [test]> SELECT * FROM Employes;
+-----+--------+---------+
| ide | nom    | prenom  |
+-----+--------+---------+
|   1 | DUPONT | Michel  |
|   2 | ANDRE  | David   |
|   3 | MOREAU | Natalie |
+-----+--------+---------+
3 rows in set (0.000 sec)


-- Table `Grades`

CREATE TABLE `Grades` (
  `idg` integer NOT NULL AUTO_INCREMENT COMMENT 'ID du grade',
  `grade` varchar(25) NOT NULL DEFAULT '' COMMENT 'Libellé du grade',
  PRIMARY KEY (`idg`)
) ENGINE=MyISAM COMMENT='Table des grades';

MariaDB [test]> DESC Grades;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| idg   | int(11)     | NO   | PRI | NULL    | auto_increment |
| grade | varchar(25) | NO   |     |         |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.001 sec)

INSERT INTO `Grades` VALUES (1,'Adjudant');
INSERT INTO `Grades` VALUES (2,'Adjudant-chef');
INSERT INTO `Grades` VALUES (3,'Lieutenant');
INSERT INTO `Grades` VALUES (4,'Capitaine');
INSERT INTO `Grades` VALUES (5,'Commandant');
INSERT INTO `Grades` VALUES (6,'Colonel');

MariaDB [test]> SELECT * FROM Grades;
+-----+---------------+
| idg | grade         |
+-----+---------------+
|   1 | Adjudant      |
|   2 | Adjudant-chef |
|   3 | Lieutenant    |
|   4 | Capitaine     |
|   5 | Commandant    |
|   6 | Colonel       |
+-----+---------------+
6 rows in set (0.000 sec)


-- Table `Avoir`

DROP TABLE IF EXISTS `Avoir`;
CREATE TABLE `Avoir` (
  `ide` integer NOT NULL DEFAULT 0 COMMENT 'ID employé',
  `idg` integer NOT NULL DEFAULT 0 COMMENT 'ID grade',
  `dprom` date NOT NULL DEFAULT '0000-00-00' COMMENT 'Date de promotion',
  PRIMARY KEY (`ide`,`idg`)
) ENGINE=MyISAM COMMENT='Table des promotions';

MariaDB [test]> DESC Avoir;
+-------+---------+------+-----+------------+-------+
| Field | Type    | Null | Key | Default    | Extra |
+-------+---------+------+-----+------------+-------+
| ide   | int(11) | NO   | PRI | 0          |       |
| idg   | int(11) | NO   | PRI | 0          |       |
| dprom | date    | NO   |     | 0000-00-00 |       |
+-------+---------+------+-----+------------+-------+
3 rows in set (0.001 sec)

INSERT INTO `Avoir` VALUES (1,1,'2020-01-01');
INSERT INTO `Avoir` VALUES (2,3,'2020-01-01');
INSERT INTO `Avoir` VALUES (3,5,'2020-01-01');
INSERT INTO `Avoir` VALUES (1,2,'2022-01-01');
INSERT INTO `Avoir` VALUES (2,4,'2022-01-01');
INSERT INTO `Avoir` VALUES (3,6,'2022-01-01');

MariaDB [test]> SELECT * FROM Avoir;
+-----+-----+------------+
| ide | idg | dprom      |
+-----+-----+------------+
|   1 |   1 | 2020-01-01 |
|   2 |   3 | 2020-01-01 |
|   3 |   5 | 2020-01-01 |
|   1 |   2 | 2022-01-01 |
|   2 |   4 | 2022-01-01 |
|   3 |   6 | 2022-01-01 |
+-----+-----+------------+
6 rows in set (0.000 sec)



MariaDB [test]> SELECT nom, prenom, grade, dprom
    ->   FROM Employes, Avoir, Grades
    ->  WHERE Employes.ide=Avoir.ide
    ->    AND Grades.idg=Avoir.idg
    ->  ORDER BY dprom DESC,nom,prenom;
+--------+---------+---------------+------------+
| nom    | prenom  | grade         | dprom      |
+--------+---------+---------------+------------+
| ANDRE  | David   | Capitaine     | 2022-01-01 |
| DUPONT | Michel  | Adjudant-chef | 2022-01-01 |
| MOREAU | Natalie | Colonel       | 2022-01-01 |
| ANDRE  | David   | Lieutenant    | 2020-01-01 |
| DUPONT | Michel  | Adjudant      | 2020-01-01 |
| MOREAU | Natalie | Commandant    | 2020-01-01 |
+--------+---------+---------------+------------+
6 rows in set (0.001 sec)

MariaDB [test]> SELECT nom, prenom, grade, dprom AS 'promu le'
    ->   FROM Employes, Avoir, Grades
    ->  WHERE Employes.ide=Avoir.ide
    ->    AND Grades.idg=Avoir.idg
    ->  ORDER BY nom,prenom,dprom DESC;
+--------+---------+---------------+------------+
| nom    | prenom  | grade         | promu le   |
+--------+---------+---------------+------------+
| ANDRE  | David   | Capitaine     | 2022-01-01 |
| ANDRE  | David   | Lieutenant    | 2020-01-01 |
| DUPONT | Michel  | Adjudant-chef | 2022-01-01 |
| DUPONT | Michel  | Adjudant      | 2020-01-01 |
| MOREAU | Natalie | Colonel       | 2022-01-01 |
| MOREAU | Natalie | Commandant    | 2020-01-01 |
+--------+---------+---------------+------------+
6 rows in set (0.001 sec)
0