probleme de sélection

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : probleme de sélection

par béka » 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> ?>

par béka » 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.

par sadeq » 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);
?>

par guilt92 » 21 juin 2006, 10:28

Euh... tu repars à 0 là. Ceci dit il doit y avoir une solution en une seule requete peut etre, selon la version de sql que tu utilises et tu peux tenter ta chance sur le forum Base de données.

Sinon moi je te proposais de faire une requete en te servant du resultat d'une autre requete mais apparemment ca ne te convient pas parce que la on tourne en rond.

par béka » 21 juin 2006, 10:09

oui alors c'est bien ca, je souhaite savoir :

tous les intitulés des secteurs d'activité qui sont dans la table secteur donc là, un

Code : Tout sélectionner

SELECT intitule FROM secteur
-> ok

connaitre tous les secteurs d'activité qui ont été utilisés, mentionnés dans la table offre_emploi, pour ca

Code : Tout sélectionner

SELECT milieu_professionnel FROM offre_emploi
->ok

j'affiche que les secteurs d'activité de la table secteur uniquement lorsqu'ils figurent dans la table offre_emploi, pour ca

Code : Tout sélectionner

SELECT intitule FROM secteur, offre_emploi WHERE secteur.intitule = offre_emploi.milieu_professionnel
->ok

maintenant, ce que je souhaiterais faire, c'est afficher le nombre d'offres qu'il y a pour chaque secteur affiché et là je ne vois pas comment faire

par guilt92 » 21 juin 2006, 10:00

ok alors reprenons la modélisation :

Ton but si j ai bien compris est d obtenir le nombre d offre emploi par secteur d'activités.
Pour cela je t'ai proposé le modèle suivante :

Une requete s occupe de selectionner un par un les différents secteurs d activités. Pour chaque résultat une seconde requete se crée qui elle selectionne les offres d emplois correspondant a ce secteur. Il te suffit donc de compter le nombre de résultats de la seconde requete pour chaque itération.

Soit dit au passage si tu n'as besoin que du nombre d'emploi tu peux faire un SELECT COUNT(*) mais bon peu importe ca sera le même modèle.

par béka » 21 juin 2006, 09:53

non je vois pas et je comprends là, je suis perdu
J'ai réussi à me perdre das mon propre code

par guilt92 » 21 juin 2006, 09:52

je vois comment faire le $affichage2 mais je ne vois pas où l'utiliser et comment l'utiliser
N'oublie pas ton objectif final.
$req1 te permet de selectionner les offres d emploi dans le secteur d activités.

Je ne sais pas a quoi correspondait $affichage[0] dans ton code mais tu dois avoir l'équivalent dans un des résultats, $affichage2["titre"] ou quelque chose du genre je suppose.
Ensuite le nom du secteur est toujours $affichage["intitule"], et le nombre de résultat est mysql_num_rows($sql1).

Aussi si tu n utilise qu un seul champ de emploi n utilise pas SELECT *, utilise SELECT titre par exemple.

par guilt92 » 21 juin 2006, 09:48

Lis ton propre code...

$affichage est le resultat de ta première requete, celle qui selectionne les secteurs d activités...

De plus pour moi $req1 est fausse, il faudrait plutot :
$req1 = "SELECT * FROM offre_emploi WHERE milieu_professionnel = '".$affichage[intitule]."'"; 
car tu compares des chaines.

par béka » 21 juin 2006, 09:47

je vois comment faire le $affichage2 mais je ne vois pas où l'utiliser et comment l'utiliser

par béka » 21 juin 2006, 09:46

ben si je l'utilise puisque je fais des echo $affichage[xxx] et cette variable est définie garse a ce mysql_fetch_array()

par guilt92 » 21 juin 2006, 09:44

en créant un $affichage2 qui est le mysql_fetch_array($sql1)...
Ensuite tu comptes et tu affiches ces résultats la...
Tu crées une requete mais tu ne l'utilises pas... ;)

par béka » 21 juin 2006, 09:42

voila ma boucle while :
<? while ($affichage = mysql_fetch_array($req)){
$req1 = "SELECT * FROM offre_emploi WHERE milieu_professionnel = $affichage[intitule]";
$sql1 = mysql_query($req1); ?> 
<p class="Texte"><a href="milieu1.php?id=<? echo $affichage[0]; ?>"><font color="black"><? echo $affichage['intitule']." (".$nb_enregistrement." offres)"; ?> <br></font></a></p> 
<? 
}//end while ?>
mais ca ne marche pas, ca m'affiche tous les secteurs d'activité de la table 'secteur' alors que j'aiemerais que ca n'affiche que ceux présents dans la table 'offre_emploi' et puis ca me mets pour chaque qu'il y a 6 offres, or ce n'est pas (ca doit calculer le nombre d'intitule dans la table 'secteur')

comment arranger ca?

par béka » 21 juin 2006, 09:32

ok j'essai
je dois mettre le reste de ma boucle while après la requete qui est dans ta boucle while?

par guilt92 » 21 juin 2006, 09:14

Il faut comment par faire une requete pour avoir tous les intitulés :

SELECT DISTINCT intitule FROM secteur

Ensuite tu fais une boucle sur le résultat de cette requete un par un qui cherche le nombre d'offres d'emploi relatif a ce secteur
while($resultat1=mysql_fetch_array($rq1) {
SELECT * FROM offre_emploi WHERE milieu_professionnel = $resultat1["intitule"]
//...
}
Et enfin tu peux compter et afficher ce que tu veux.