Problème requête select

Résolu/Fermé
okbabb Messages postés 57 Date d'inscription samedi 23 avril 2022 Statut Membre Dernière intervention 15 mai 2023 - 22 sept. 2022 à 13:21
jee pee Messages postés 39631 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 - 27 sept. 2022 à 11:06

Bonjour,

table: personnes
ID nom
1 Jack
2 Daniel

table: structures
id_structure nom_structure
1 Centre_1
2 Centre_2

table: lieux_travail_employes
id_lieu_travail_employe date_lieu_travail id_structure ID
1 01-01-2021 2 1
2 01-01-2022 1 1

table: fonctions_employes
id_fonction_employe date_fonction id_structure ID
1 01-01-2021 1 1
2 01-01-2022 2 1

Je veux le résultat suivant: (avec sous-select date le plus récent)

nom lieu_travail lieu_fonction
Jack Centre_1 Centre_2


J'ai commencé par la requête suivante (sans sous-select de date) pour tester mais ça ne marche pas :/

SELECT nom,
LT.nom_structure AS lieu_travail,
LF.nom_structure AS lieu_fonction
FROM personnes P, fonctions_employes FE, lieux_travail_employes LTE
LEFT JOIN structures LT ON LT.id_structure = P.lieu_travail
LEFT JOIN structures LF ON LF.id_structure = P.lieu_fonction

Quel est le problème s'il vous plais ?

2 réponses

jee pee Messages postés 39631 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234
Modifié le 22 sept. 2022 à 14:26

Bonjour,

Quand tu annonces "ça ne marche pas" il faut expliquer ce qui se passe, donner le message d'erreur, ...

Tu n'as pas de critère de restriction entre personnes et fonctions_employes et entre personne et travail_employes

Puisque tu t'es lancé dans les jointures, tu devrais aussi en faire sur les 2 tables  fonctions_employes et travail_employes , et ne laisser dans le from que la table personnes


0
okbabb Messages postés 57 Date d'inscription samedi 23 avril 2022 Statut Membre Dernière intervention 15 mai 2023
22 sept. 2022 à 14:45

J'ai ajouté les critères de restriction et j'ai retiré les deux tables depuis FROM comme vous m'a dit et j'ai testé comme ça:

SELECT nom,
LT.nom_structure AS lieu_travail,
LF.nom_structure AS lieu_fonction
FROM personnes P
LEFT JOIN structures LT ON LT.id_structure = P.lieu_travail
LEFT JOIN structures LF ON LF.id_structure = P.lieu_fonction
WHERE P.ID=fonctions_employes.ID
AND P.ID=lieux_travail_employes.ID

il m'affiche le message suivant:

#1054 - Champ 'fonctions_employes.ID' inconnu dans where clause

(je travaille sur MySQL, phpMyAdmin version 4.9.7)

0
jee pee Messages postés 39631 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234 > okbabb Messages postés 57 Date d'inscription samedi 23 avril 2022 Statut Membre Dernière intervention 15 mai 2023
22 sept. 2022 à 14:48

Il faut les retirer du from et rajouter 2 LEFT JOIN pour ces tables, et supprimer le WHERE

0
okbabb Messages postés 57 Date d'inscription samedi 23 avril 2022 Statut Membre Dernière intervention 15 mai 2023 > jee pee Messages postés 39631 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024
22 sept. 2022 à 15:04

J'ai fais comme ça:

SELECT nom,
LT.nom_structure AS lieu_travail,
LF.nom_structure AS lieu_fonction
FROM personnes P
LEFT JOIN structures LT ON LT.id_structure = P.lieu_travail
LEFT JOIN structures LF ON LF.id_structure = P.lieu_fonction
LEFT JOIN fonctions_employes FE ON FE.ID = P.ID
LEFT JOIN lieux_travail_employes LTE ON LTE.ID = P.ID

#1054 - Champ 'P.lieu_travail' inconnu dans on clause

0
jee pee Messages postés 39631 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234 > okbabb Messages postés 57 Date d'inscription samedi 23 avril 2022 Statut Membre Dernière intervention 15 mai 2023
22 sept. 2022 à 15:11

lieu_travail et lieu_fonction ne sont pas dans la table personnes

il faut faire les liens entre les id lieu sur LT LTE, et LF FE

0
okbabb Messages postés 57 Date d'inscription samedi 23 avril 2022 Statut Membre Dernière intervention 15 mai 2023 > jee pee Messages postés 39631 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024
22 sept. 2022 à 16:06

J'ai corrigé comme ça:

SELECT nom,
LT.nom_structure AS lieu_travail,
LF.nom_structure AS lieu_fonction
FROM personnes P
LEFT JOIN structures LT ON LT.id_structure = LTE.lieu_travail
LEFT JOIN structures LF ON LF.id_structure = FE.lieu_fonction
LEFT JOIN fonctions_employes FE ON FE.ID = P.ID
LEFT JOIN lieux_travail_employes LTE ON LTE.ID = P.ID

#1054 - Champ 'LTE.lieu_travail' inconnu dans on clause

0
jee pee Messages postés 39631 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234
Modifié le 22 sept. 2022 à 17:04

l'id_structure tu vois que c'est toujours une mauvaise idée de ne pas avoir id_personne ;-)

SELECT nom,
LT.nom_structure AS lieu_travail,
LF.nom_structure AS lieu_fonction
FROM personnes P
LEFT JOIN fonctions_employes FE ON FE.ID = P.ID
LEFT JOIN lieux_travail_employes LTE ON LTE.ID = P.ID
LEFT JOIN structures LT ON LT.id_structure = LTE.id_structure
LEFT JOIN structures LF ON LF.id_structure = FE.id_structure
0
okbabb Messages postés 57 Date d'inscription samedi 23 avril 2022 Statut Membre Dernière intervention 15 mai 2023
26 sept. 2022 à 17:13

Merci bien mon ami jee pee vous êtes un génie, mais entre nous je suis pas convaincu de mon type de travail sur cette partie (historisation), ce type de travail est très compliqué, mais le problème j'ai pas le choix ou je ne sais pas comment gérer le projet comme il faut, j'espère que tu peut m'aider à me donner une autre idée plus simple que mon type de travail actuel.

Je travaille maintenant sur une application web de GRH avec php et MySQL, dans la partie historisation, il faut que chaque employé obtient un nouveau grade, tous ses anciens grades restent enregistré à la base des données, et tous les autres informations (déplacement d'un lieux de travail à un autre, les fonctions...).

Il faut que chaque modification de (gradation, ou changement lieux de travail, nouvelle fonction de travail) doit être enregistré, et en même temps je veux pas le système enregistre dans la table d'historisation les modifications à cause d'erreur de choix du grade ou nouveau lieux de travail...

Quelle est la meilleur méthode d'historisation ou méthode de travail plus simple ?

0
jee pee Messages postés 39631 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234 > okbabb Messages postés 57 Date d'inscription samedi 23 avril 2022 Statut Membre Dernière intervention 15 mai 2023
26 sept. 2022 à 17:30

J'ai vu plusieurs logiciels de Gestion du Personnel. La plupart des tables sur le statut (grade, fonction, salaire, lieu de travail, ...) étaient toujours historisées avec 2 champs, date de début, et date de fin. Même des infos moins primordiales comme le domicile, les conjoints, ... l'étaient. Le dernier enregistrement de ces séquences historisées avaient une date de fin théorique très éloignée, comme 31/12/2099.

En cas d'anomalie ou de saisie erronée, il faut gérer une suppression de l'enregistrement en question, et une maj soit de la date de fin de l'enregistrement précédent, soit la date de début de l'enregistrement suivant. En demandant à l'utilisateur quelle est la solution à retenir.

0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > jee pee Messages postés 39631 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024
27 sept. 2022 à 10:32

bonjour,

La date de fin n'est pas toujours nécessaire.  Il est parfois préférable de la déterminer à partir de la date de début suivante.

0
jee pee Messages postés 39631 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 avril 2024 9 234 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
Modifié le 27 sept. 2022 à 11:06

Certes, il y a des applications où on peut s'en passer. Mais dans un calcul de paie où tu veux de nombreuses valeurs, à une date précise de la carrière, il peut être plus facile d'accéder directement à l'enregistrement souhaité, que de devoir faire aussi référence au suivant avec peut être un sous select à chaque fois.

WHERE ...
AND '30/09/22' BETWEEN grade.date_debut AND grade.date_fin
AND '30/09/22' BETWEEN echelon.date_debut AND echelon.date_fin
AND '30/09/22' BETWEEN indice.date_debut AND indice.date_fin
AND '30/09/22' BETWEEN IM.date_debut AND IM.date_fin
...
0