probleme de sélection

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 juin 2006, 10:30

Tu veux :
... un script qui permet d'afficher un secteur d'activité une seule fois et d'afficher le nombre d'offres d'emploi qui correspond à ce secteur d'activité....
D'abord, c'est normal qu'il t'affiche le même nombre car tu comptes toutes les offres de tous les secteurs.
En plus et même si tu ne comptais que les offres par secteur ton affichage actuel fait que devant les liens vers les offres de même secteur tu auras toujours le même nombre.

Cette forme d'affichage correspond alors à ta logique d'affichage.

Mais tout d'abord il faut résoudre le problème de base : Il faut compter le nombre d'offres par secteur.

Puisque tu fais déjà un regroupement par secteur dans ta requête c'est bien, il faut simplement ajouter dans cette requête un champ calculé qui compte le nombre d'offres par secteur : Count(*) avec un GROUP BY secteur.intitule

Mais il y a 2 cas :
1. si tu veux qu'un secteur n'apparaisse qu'une seule fois avec le nombre d'offres qui lui correspondent, il ne faut pas inclure des champs qui définissent l'offre dans le SELECT au risque que les infos des offres d'un secteur soient incluses dans le résultat et produisent des doublons de même secteur et nombre d'offres par secteur

La requête qui retourne alors le nombre d'offre par secteur est :
SELECT secteur.intitule, Count(*) as nb_offres
FROM secteur, offre_emploi
WHERE secteur.intitule=offre_emploi.milieu_professionnel
GROUP BY secteur.intitule

le champ calculé "nb_offres" est fait d'un Count(*) c'est à dire qu'il compte les enregistrements qui correspondent au critère de regroupement cité dans le GROUP BY. En l'occurence, ce champ retourne le nombre d'offres par secteur.

Exemple :
  • secteur1 ---- 2
    secteur2 ---- 1
    ....
où un secteur n'apparait qu'une seule fois avec le nombre des ses offres et c'est dù au regroupement par secteur
Seulement on n'a pas l'information sur le détail des offres

2. Si tu veux récupèrer le détail des offres par secteur :
SELECT offre_emploi.milieu_professionnel, offre_emploi.id, offre_emploi.description
FROM offre_emploi
GROUP BY offre_emploi.milieu_professionnel

Cette requête retourne donc tous les intitulés de secteurs, les id et descriptions des offres. Exemple :
  • secteur1 ---- offre1 --- description de offre1
    secteur1 ---- offre2 --- --- description de offre2
    secteur2 ---- offre3 --- description de offre3
    ....
ici, le secteur "secteur1" a 2 offres : "offre1" et "offre2"
Dans cette requête l'intitulé d'un secteur se répéte selon le nombre des offres qui lui correspondent. C'est normal et c'est dù à la présence des champs "id" et "description" de l'offre même s'il y a regroupement par secteur.

Le regroupement sert simplement à organiser la sélection avec ou sans le détail des offres

Tu peux exécuter les 2 types de requêtes succéssivement pour satisfaire tes affichage :
1. Affichage du secteur et le nombre de ses offres
2. suivi des affichages des offres qui correspondent à ce secteur en paramètrant la 2° requête par intitulé donné


Proposition de correction
<?
....
//requete SQL R1=secteur + nombre de ses offres
$sql_R1 = "SELECT secteur.intitule, Count(*) as nb_offres
FROM secteur, offre_emploi 
WHERE secteur.intitule=offre_emploi.milieu_professionnel 
GROUP BY secteur.intitule";

$R1 = mysql_query($sql_R1) or die(mysql_error()); 

//si il existe une réponse////////// 
///////////////////////////////////////////////// 
if($R1) 
   { 
//1° boucle qui affiche l'info secteur + nombre d'offres
while ($affichage_R1 = mysql_fetch_array($R1)){
       echo "<p>Secteur : $affichage_R1[intitule] ($affichage_R1[nb_offres]) offres";

//requete SQL R2=détail de l'offre d'un secteur donné
        $sql_R2 = "SELECT offre_emploi.milieu_professionnel , offre_emploi.id, offre_emploi.description
FROM offre_emploi 
WHERE offre_emploi.milieu_professionnel = '$affichage_R1[intitule]'
GROUP BY offre_emploi.milieu_professionnel";

$R2 = mysql_query($sql_R2) or die(mysql_error());

//Sous-Boucle d'affichage des liens qui affiche le lien d'envoi vers les offres du secteur en cours par leur id
      while ($R2 && $affichage_R2 = mysql_fetch_array($R2)){ ?> 
<p class="Texte"><a href="milieu1.php?id=<? echo $affichage_R2['id']; ?>"><font color="black"><? echo $affichage_R2['description']; ?> <br></font></a></p> 
<? 
       }//end while R2

   }//end while R1

} //end if 
else 
{ 
echo "il n'y a aucun renseignement correspondant à votre requète"; 
} 
mysql_close($db);
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 536 Messages

21 juin 2006, 10:37

en fait guilt92 si je suis reparti de zéro c'était pour m'éclaircir les idées et y voir un peu plus clair.
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!

Mammouth du PHP | 536 Messages

21 juin 2006, 11:02

merci sadeq, ca corespond a ce que je voulais. Pour info, j'avais presque trouvé, avec les info de guilt92, j'ai compris qu'il fallait faire un count.

Mais le truc aussi, c'est qu'en cliquant sur le secteur d'activité qu'on souhaite, on arrive sur une page proposant toutes les offres.

Pour ca, j'avais pensé faire donc une premiere page : milieu.php qui propose le nombre d'offres par secteur (ce qu'on vient de faire). Puis en cliquant sur un secteur, on est redirigé vers milieu1.php qui propose la liste des offres et en cliquant sur une offre, on est redirigé vers une page milieu2.php qui propose le détail de l'offre

Les pages sont faites, mon seul problème est que je n'arrive pas a faire le lien entre milieu.php et milieu1.php , pour le reste c'est bon.

Le lien se fait à ce niveau :
<? while ($affichage_R1 = mysql_fetch_array($R1)){ 
       echo "<p class=\"Texte\">$affichage_R1[intitule] ($affichage_R1[nb_offres] offres)"; ?>


non si c'est bon, ca marche, alors voici comment j'ai fait :
<? //1° boucle qui affiche l'info secteur + nombre d'offres 
while ($affichage_R1 = mysql_fetch_array($R1)){ ?>
       <p class="Texte"><a href="milieu1.php?id=<? echo $affichage_R1['intitule']; ?>"><font color="black"><? echo "$affichage_R1[intitule] ($affichage_R1[nb_offres] offres)"; ?> <br /></font></a></p> ?>
Un prof désespéré à son élève :
- Et maintenant, dessinez-moi un cercle au tableau... Voila... Alors qu'est-ce que c'est?
- Ben un cercle ?
- Non, c'est votre note, sortez !!