Requète SQL

Résolu
papyclic Messages postés 451 Statut Membre -  
papyclic Messages postés 451 Statut Membre -
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

  • 1
  • 2
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. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    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 );
    

    0
  2. papyclic Messages postés 451 Statut Membre 3
     
    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
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      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
      
      0
  3. papyclic Messages postés 451 Statut Membre 3
     
    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
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Tu l'as testé directement dans ta bdd hein ?
      0
  4. papyclic Messages postés 451 Statut Membre 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.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. papyclic Messages postés 451 Statut Membre 3
     
    en rajoutant
    WHERE CG.dfin IS NULL
    cela me retourne les fonctions également qui n'ont jamais été occupé
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      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
      
      0
  7. papyclic Messages postés 451 Statut Membre 3
     
    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.
    0
  8. papyclic Messages postés 451 Statut Membre 3
     
    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.
    0
  9. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     

    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
    
    

    0
  10. papyclic Messages postés 451 Statut Membre 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.
    0
  11. papyclic Messages postés 451 Statut Membre 3
     
    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.
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      Il faudrait un dump (structure + données) pour essayer de comprendre ce qui bloque et comment est fait ta BDD.
      0
  12. papyclic Messages postés 451 Statut Membre 3
     
    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
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      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 ....
      0
  13. papyclic Messages postés 451 Statut Membre 3
     
    Bonjour,
    je suis toujours à la recherche d'une solution à mon problème en fait.
    Merci
    0
  14. papyclic Messages postés 451 Statut Membre 3
     
    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.
    0
    1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
       
      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)
      0
  15. papyclic Messages postés 451 Statut Membre 3
     
    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
    0
  16. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    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.

    0
  17. papyclic Messages postés 451 Statut Membre 3
     
    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
    0
  • 1
  • 2