Requête sql select

Résolu
okbabb Messages postés 59 Statut Membre -  
heliconius Messages postés 584 Statut Membre -
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

  1. jee pee Messages postés 31908 Date d'inscription   Statut Modérateur Dernière intervention   9 985
     
    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
  2. okbabb Messages postés 59 Statut Membre
     
    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
  3. okbabb Messages postés 59 Statut Membre
     
    Merci jee pee, c'est bon, le problème est résolu
    0
  4. heliconius Messages postés 584 Statut Membre 143
     
    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
    1. jee pee Messages postés 31908 Date d'inscription   Statut Modérateur Dernière intervention   9 985
       
      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
    2. heliconius Messages postés 584 Statut Membre 143
       
      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