Requête sql select
Résolu/Fermé
okbabb
Messages postés
57
Date d'inscription
samedi 23 avril 2022
Statut
Membre
Dernière intervention
15 mai 2023
-
Modifié le 24 mai 2022 à 14:32
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 2 juin 2022 à 04:07
heliconius Messages postés 539 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 2 juin 2022 à 04:07
4 réponses
jee pee
Messages postés
40579
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
21 décembre 2024
9 460
Modifié le 24 mai 2022 à 14:42
Modifié le 24 mai 2022 à 14:42
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
okbabb
Messages postés
57
Date d'inscription
samedi 23 avril 2022
Statut
Membre
Dernière intervention
15 mai 2023
24 mai 2022 à 14:48
24 mai 2022 à 14:48
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
okbabb
Messages postés
57
Date d'inscription
samedi 23 avril 2022
Statut
Membre
Dernière intervention
15 mai 2023
24 mai 2022 à 15:41
24 mai 2022 à 15:41
Merci jee pee, c'est bon, le problème est résolu
heliconius
Messages postés
539
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
23 juin 2023
139
1 juin 2022 à 17:24
1 juin 2022 à 17:24
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
jee pee
Messages postés
40579
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
21 décembre 2024
9 460
1 juin 2022 à 17:49
1 juin 2022 à 17:49
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"
heliconius
Messages postés
539
Date d'inscription
mardi 1 juillet 2008
Statut
Membre
Dernière intervention
23 juin 2023
139
2 juin 2022 à 04:07
2 juin 2022 à 04:07
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)