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. merci j'ai finalement trouvé ce que je voulais obtenir.
    Merci
    1. Bonjour
      Excuse moi j'ai besoin de conseil, quelque chose que je n'arrive pas à comprendre en fait.
      J'ai donc créé la table cdc_postes comme tu me l'a suggéré malgrès tout les postes vacants ne s'affichent pas.
      La structure de cette table j'ai l'idpers à 0 cela a t-il une influence? je te joint une capture juste pour que tu vois et la rquète complète, en te remerciant si tu peux m'aider encore.

      https://www.cjoint.com/c/FIChjWtH2Lk
      $requete  = "SELECT nom,prenom,fonction,fnbur
      FROM cdc_personnes,cdc_postes,cdc_fonctions
      WHERE cdc_postes.idpers=cdc_personnes.idpers
      AND cdc_postes.idfonc=cdc_fonctions.idfonc";
      $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>";
      }
      
      1. Bonjour
        je pense avoir compris, je vais commencer de ce pas.
        Je te remercie.
        Cordialement
        1. Bonjour,
          J'ai essayé de rédiger ça sur papier il y a un détail qui m'échappe. Aujourd'hui nous avons 4 professeur si l'an prochain il y en a 2
          Donc il va en ressortir

          idfonction idpers

          7 9
          7 8
          7 poste vacant
          7 poste vacant

          Alors que ce n'ai pas des postes vacant.
          Je ne sais plus peut-être j'ai mal compris.
          Je te remercie
          1. Modérateur
            ... Il te suffit de retirer de la liste des postes les 2 professeurs en trop.... c'est à ça que sert cette table.
        2. Modérateur
          Actuellement dans cdc_gerer .. tu mets toutes les personnes qui ont occupés un poste .... d'où le souci pour savoir qui occupe quel poste actuellement et si un poste est vacant ou non....

          A la limite tu peux garder cette table pour conserver l'historique des postes...
          par contre, pour savoir quels postes sont occupés ou vacants..il te faut une table intermédiaire comme ceci je pense :


          1. merci effectivement c'est une piste

            cdc_postes
            | idpers | idfonc | ddebut | dfin |

            cdc_gerer
            à conserver tel quel pour l'historique
            | idpers | idfonc | ddebut | dfin |

            cdc_fonctions
            à conserver tel quel

            cdc_personnes
            idem

            Merci tu peux me dire si c'est bien cela qu'il faudrait réorganiser, je n'arrive pas bien à faire la difference entre les tables cdc_postes et cdc_gerer.
            Faut-il mettre également une date de début et de fin dans la table cdc_postes.
            1. Modérateur
              Dans ce cas je pense que c'est la structure de tes tables qui ne vont pas..
              Par exemple... tu as plusieurs professeurs... sauf qu'il n'y a qu'un seul ID (7).
              Comment savoir que tu devrais avoir 1,2 ou 10 prof ??

              Je pense que pour simplifier les choses il faudrait organiser ta bdd comme ça :

              cdc_personnes : ok
              cdc_fonctions : Liste des fonctions : OK
              cdc_postes : Liste des Postes (en gros, une ligne par "poste" à occuper avec un lien sur la table cdc_fonction (idfonc) et un lien avec la table cdc_personnes (pour n'y mettre QUE les personnes en poste actuellement...et laisser vide pour les postes vacants)
              Et enfin, une table dans laquelle tu pourrais mettre l'historique

              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. 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
                    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. 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 à mon problème en fait.
                      Merci
                      1. 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 ....
                      2. 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.
                      3. 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. 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
                          • 2