Requête sql select
Résolu
okbabb
Messages postés
59
Statut
Membre
-
heliconius Messages postés 584 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:
Mais je n'arrive pas à résoudre cette requête
Merci.
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.
A voir également:
- Requête sql select
- Please select boot device - Forum Matériel & Système
- Logiciel sql - Télécharger - Bases de données
- &Quot;Please select a boot device " ? ??? - Forum Windows
- Blob sql ✓ - Forum Webmastering
- Reboot and select proper boot device asus - Forum Matériel & Système
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
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
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
nom nom_grade
Michel Adjudant
David Lieutenant
Natalie Commandant
Michel Adjudant-chef
David Capitaine
Natalie Colonel
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 :
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 :
ORDER :
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
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)