Requète SQL

Résolu
Bonjour,
J'ai une requète qui me permet d'afficher les fonctions des responsables de notre association, dont la date de fin est vide. Actuellement il y a un poste vacant donc cette fonction devrait afficher par exemple...
Président-Adjoint: poste vacant
Si par exemple une fonction n'est pas attribuée je souhaiterai pour afficher "poste vacant" je tourne ma requète dans tous les sens mais en vain. Pouvez-vous m'aider s'ils vous plait.
Un grand merci

La table cdc_gerer
idpers
idfonc
ddebut
dfin

la table cdc_fonctions
idfonc fonction fnbur
1 Président 1
2 Président-adjoint 1
3 Secrétaire 1

etc
Voici la fameuse requète...
<?php
$requete  = "SELECT nom,prenom,fonction,fnbur
        FROM cdc_gerer
        RIGHT JOIN cdc_fonctions ON cdc_gerer.idfonc=cdc_fonctions.idfonc
        LEFT JOIN cdc_personnes ON cdc_personnes.idpers=cdc_gerer.idpers
        WHERE cdc_gerer.dfin = 0
        ORDER BY fnbur DESC,fonction,nom,prenom";
$resultat = execRequete($requete,$connexion);

$place = "";
echo "<ul>";
while($r=mysql_fetch_object($resultat)) {
	if($r->fnbur != $place) {
		switch ($r->fnbur) {
			case '0': $domaine = "Autres responsabilités"; break;
			case '1': $domaine = "Bureau"; break;
		}
		echo "</ul><h2>$domaine</h2><ul>";
		$place = $r->fnbur;
	}
	$lien = "javascript:alert('Changer le $r->fonction : à venir...')";
	if(!$r->nom) { $personne = " <span style=\"color:#808080\"><gras>poste vacant</gras></span>"; } else { $personne = "$r->nom $r->prenom"; }
	echo "<li> <a href=\"$lien\">$r->fonction</a>: $personne</li>";
}
?>

27 réponses

Résumé de la discussion

Problème : afficher fonctions des responsables d'une association lorsque la date de fin est vide ou passée et afficher « poste vacant » pour les postes non occupés. Des échanges proposent d'enrichir la requête SQL et les jointures (LEFT JOIN, RIGHT JOIN) en ajoutant des conditions sur la date de fin, NULL et 0000-00-00 pour capter postes passés et jamais occupés. D'autres répondants expliquent que certaines entrées restent invisibles car les résultats n'incluent pas les postes toujours vacants ou ayant été occupés avant aujourd'hui, et proposent d'adapter les critères. Plusieurs commentaires insistent sur la cohérence des données et évoquent des vérifications de type « dump » structure et données pour diagnostiquer les résultats et obtenir l’affichage souhaité.

Bobot (l’IA à votre service)
  1. Modérateur
    Bonjour,

    1 - tu utilises l'ancienne extension Mysql (considérée comme obsolète ! )
    Je t'invite fortement à passer à mysqli ou ( perso je préfère...) la PDO.

    Je t'invite à lire ceci :
    - https://www.commentcamarche.net/faq/43261-php-l-extension-mysql-est-obsolete
    - https://www.commentcamarche.net/faq/44117-connexion-a-une-base-avec-pdo-mysqli

    2 - Ton souci concerne la requête elle même ou le code PHP qui l'exécute ?
    Si le souci concerne UNIQUEMENT ta requête... c'est dans le forum Bases de données qu'il faut la poser (je pourrais y déplacer cette discussion si besoin).

    3 - Je ne suis pas sûr d'avoir compris ta question...
    En fait tu cherches à récupérer la liste des postes non-occupés c'est ça ?
    Donc les POSTES dont l'ID ne serait pas présent dans la table cdc_gerer... non ?
    Un truc du genre :
    SELECT *
    FROM cdc_fonctions 
    WHERE idfonc NOT IN (SELECT idfonc  FROM cdc_gerer );
    

    1. Bonjour
      En fait il faut que je récupére l'ID de la table cdc_fonction qui est dans la table cdc_gerer et qui à une date de fin vide.
      Si tu peux regarder à la ligne 22 sur mon premier post je crois que c'est cela qui ne va pas.
      Pour tout te dire je suis perdu.
      Lorsque j'avais aucune entrée dans la table cdc_gerer voilà ce que la requète me retournait...
      Président: poste vacant
      Secrétaire: poste vacant
      Trésorier: poste vacant
      

      lorsque j'ai fait les entrées
      Président: Dupont Pierre
      Secrétaire: Dupont Paul
      

      La structure de la table cdc_gerer
      idpers  idfonc  ddebut  dfin
      int(11)  int(11)  date  date
      

      Merci
      1. Modérateur
        Tu peux tester cette requête et me dire ce qu'elle te donne ?

        SELECT CP.nom
              ,CP.prenom
              ,CF.fonction
              ,CP.fnbur
        FROM  dc_fonctions CF 
        LEFT JOIN cdc_gerer CG ON CG.idfonc = CF.idfonc
        LEFT JOIN cdc_personnes CP ON CP.idpers = CG.idpers 
        WHERE CG.dfin = 0
        ORDER BY fnbur DESC,fonction,nom,prenom
        
    2. Bonjour
      Merci de ta réponse malheureusement elle ne me retourne pas les postes vacants....
      J'ai juste corrigé
      CF.fnbur au lieu de CP.fnbur
      1. Modérateur
        Tu l'as testé directement dans ta bdd hein ?
    3. je viens de la tester et cela me retourne uniquement les fonctions dont la date est vide.
      Pour essayer d'être encore mieux explicite...
      Par exemple la fonction "Président-Adjoint" dans le passé cette fonction était occupé mais plus aujourd'hui donc il y a une date de début et une date de fin donc le poste est vacant.
      1. en rajoutant
        WHERE CG.dfin IS NULL
        cela me retourne les fonctions également qui n'ont jamais été occupé
        1. Modérateur
          Donc c'est bon non ?

          Par contre c'est un OR que j'aurai mis dans la requête :
          SELECT CP.nom
                ,CP.prenom
                ,CF.fonction
                ,CP.fnbur
          FROM  dc_fonctions CF 
          LEFT JOIN cdc_gerer CG ON CG.idfonc = CF.idfonc
          LEFT JOIN cdc_personnes CP ON CP.idpers = CG.idpers 
          WHERE CG.dfin = 0 
                  OR CG.dfin IS NULL 
          ORDER BY fnbur DESC,fonction,nom,prenom
          
      2. Bonjour,
        Non ce n'ai toujours pas ce que je souhaite malheureusement.
        Les entrées retournées sont les fonctions dont la date de fin est "0000-00-00" ou NULL c'est à dire jamais occupé c'est déja ça...
        Maintenant il faudrait également les fonctions qui ne sont pas occupées actuellement, mais qu'elles l'ont été dans le passé.
        exemple
        Président-Adjoint poste occupé 2012-02-04 au 2015-03-01 aujourd'hui Poste vacant.
        Merci de ton aide.
        1. Bonjour,
          Pouvez-vous essayez de m'aider s'ils vous plait, je commence à désespérer pour trouver la solution à mon problème.
          Je vous remercie.
          Bonne nuit à tous.
          1. Modérateur

            Maintenant il faudrait également les fonctions qui ne sont pas occupées actuellement, mais qu'elles l'ont été dans le passé.


            Dans ce cas, tu ajoutes dans ton where une condition sur la date tout simplement.... (http://www.w3schools.com/sql/func_now.asp)

            Un truc du genre
            SELECT CP.nom
                  ,CP.prenom
                  ,CF.fonction
                  ,CP.fnbur
            FROM  dc_fonctions CF 
            LEFT JOIN cdc_gerer CG ON CG.idfonc = CF.idfonc
            LEFT JOIN cdc_personnes CP ON CP.idpers = CG.idpers 
            WHERE CG.dfin = '0000-00-00' 
                    OR CG.dfin IS NULL 
                    OR CG.dfin <now()
            ORDER BY fnbur DESC,fonction,nom,prenom
            
            

            1. Bonjour
              En fait j'avais déjà essayé mais cela me rencoie toutes les fonctions avec une dates de fin avant la date d'aujourd'hui. Je me pose la question si cela est possible avec le nombre de tutos sur les dates que j'ai regardé.
              Il faut me retourner les fonctions innocupées, malgrès tout elles ont quand même une date de fin puisque elles ont été occupé à un moment donnée.
              Peut-être la structure de ma table est à revoir?
              Merci encore de ton aide.
              1. bonjour,
                Excusez moi d'insister mes encore une grande partie de la journée à essayer de trouver la solution mais en vain.
                J'espère encore trouver de l'aide.
                je vous remercie.
                1. Modérateur
                  Il faudrait un dump (structure + données) pour essayer de comprendre ce qui bloque et comment est fait ta BDD.
              2. Bonjour,
                avec les 2 liens des captures de mes tables, cela t'aiderai à mieux comprendre pour essayez de m'aider s'il te plait? je suis perdu.
                Je te remercie.
                Bonne nuit
                1. Modérateur
                  Sauf que c'est un DUMP de tes tables qu'il me faut ;... pas une capture écran ....
                  Je ne vais pas m'amuser à recréer tes tables à la main alors qu'un DUMP me permet de les créer automatiquement ....
              3. Bonjour,
                je suis toujours à la recherche d'une solution à mon problème en fait.
                Merci
                1. Bonjour
                  Personnes pour essayer de me venir en aide s'ils vous plait.
                  Cela viens bien de ma requète en fait si vous pouvez déplacer ce post comme me l'a proposé "jordane45" en vous remerciant.
                  J'essaie de tourner ma requète dans tous les sens mais je n'y arrive pas.
                  Merci.
                  1. Modérateur
                    Après avoir chargé tes données et regarder ce qu'il y avait dedans... je ne suis plus très sûr de ce que tu cherches à obtenir.....

                    Pourrais tu nous faire un dessin ? ( dans un tableau excel... présente nous ce que tu souhaites obtenir comme tableau en te basant sur les données que tu nous as transmis sur ci-joint)
                2. Bonjour
                  Je suis toujours à la recherche d'une solution, si une personne pourrai m'aider s'ils vous plait
                  Je vous remercie.
                  Bonne journée
                  1. Modérateur
                    J'ai regardé tes données..... et voulu les adapter à ton tableau....
                    Le problème .. c'est que ton tableau Excel ne peut pas correspondre.... ou alors tu ne nous as pas tout dit...

                    Si je prends l'exemple du président....
                    Dans ton tableau Excel tu mets :
                    Président: CHIABERTO Gilbert

                    Hors.. dans les données Excel on trouve :


                    Donc... comment sais tu que c'est Gilbert le président... et non Marie-Christine ??
                    De plus... vu les dates de "fin" .. il ne devrait même pas y avoir de président en fait.....

                    Et c'est pareil pour toutes tes autres lignes.....

                    Au passage.. dans ta BDD .. la date de fin MAX est le 2016-03-31 ... donc autant dire qu'il n'y a plus personne en poste .....

                    Lorsque je t'ai demandé un "dessin" .. je t'ai bien dit : En te basant sur les données que tu nous mis à disposition....
                    Donc soit ton dessin est faux... soit les données fournies ne nous permettent pas de réaliser ce que tu veux...

                    Voilou.

                    1. Bonjour
                      Si mes données après vérification sont exact. Le dernier fichier excel "responsabilité" est exactement ce que je souhaiterai obtenir aujourd'hui en fait comme nous n'avons pas de président-adjoint le poste est vacant.
                      Car cette responsabilité ayant était occupé dans le passé il y a obligatoirement une date de fin.
                      Alors excuse moi peut-être je n'arrive pas expliquer réellement mon soucis mais je peux te garantire que toutes les données sont issues de ma BDD et elles sont toutes exact c'est promis.
                      En fait le président dans la table cdc_gerer l'idfonc est le 1 est l'idpers est le 2 avec une date de fin à 0 donc c'est le président en exercice.
                      En fait aujourd'hui ma requète me retourne bien les fonctions dont la date de fin est à 0 mais pas le(les) postes qui sont vacants.
                      Merci et bonne soirée
                      • 1
                      • 2