Jointure

shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013 - 12 juin 2007 à 21:22
cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 - 15 juin 2007 à 10:17
Bonsoir,

j'aimerai m'améliorer en PHP/MySQL en commencant avec les jointures, j'aimerai pour sa être un peu guidé car malgré les tutos j'ai du mal: voici la question d'origine que j'ai pu avoir, typique d'un test d'embauche en tant que développeur php:

- Afficher les clients (avec leur commercial) par région - voir exemple ci contre

$region
-$client_nom $client_prenom :: ($commercial_nom $commercial_prenom)

-$client_nom $client_prenom :: ($commercial_nom $commercial_prenom)

-$client_nom $client_prenom :: ($commercial_nom $commercial_prenom)

$region
-$client_nom $client_prenom :: ($commercial_nom $commercial_prenom)

-$client_nom $client_prenom :: ($commercial_nom $commercial_prenom)

-$client_nom $client_prenom :: ($commercial_nom $commercial_prenom)

etc....

pour cela on a le shéma suivant:
table: clients
- id (integer)
- civilite enum('Mme','M','Mlle')
- nom (varchar)
- prenom (varchar)
- commercial_id: (integer)

table: commerciaux
- id: (integer)
- nom (varchar)
- prenom
- telephone (varchar)
- region_id (integer)

table: regions
- id (integer)
- libelle (varchar)
Voila tout, si vous pourriez me faire un exemple, je demande pas la soluce mais la manière de traiter vraiment les données par jointures avec 3 tables, sachant que commercial_id id de la table commerciaux et que region_id id de la table regions

Merci d'avance

17 réponses

cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 3
12 juin 2007 à 21:42
tu peut faire :
select * from clients, commerciaux, regions where clients.commercial_id=commerciaux.id and commerciaux.region_id=regions.id

voila je pense que ca doit etre ca mais pas sur..
0
shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013
12 juin 2007 à 21:44
ouai mais comment je retourne mes values ensuite afin de formater ma page comme je l'ai mise :s
0
cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 3
12 juin 2007 à 22:05
donc tu fais :
$query="select clients.nom,clients.prenom,commerciaux.nom,commerciaux.prenom,regions.libelle from clients, commerciaux, regions where clients.commercial_id=commerciaux.id and commerciaux.region_id=regions.id";
$result=mysql_query($query);
$row=mysql_fetch_array($result);

$row[4]
echo $row[0]. $row[1]." :: (".$row[2].$row[3]) ."
";
echo $row[0]. $row[1]." :: (".$row[2].$row[3]) ."
";
echo $row[0]. $row[1]." :: (".$row[2].$row[3]) ."
";
echo "
";

ca devrai marcher
0
shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013
13 juin 2007 à 08:09
en fait j'ai fais a peu près ca mais je ne vois pas pourquoi ca ne marche pas, un peu d'aide :s

http://rafb.net/p/wA9ca120.html
coté code ca me ressort:

- .$prenom_client $nom_commercial ($prenom_commercial $region)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 3
13 juin 2007 à 16:24
est ce ke tu peu me montrer le bout de code que tu a utiliser ou c exactement le meme?La structure de ta base de donnee c bien celle donnee plus haut?
0
shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013
14 juin 2007 à 07:51
voila le code complet si ca peut t'aider mais la requete reste la mêmehttp://rafb.net/p/WCtWZb76.html

vraiment pas d'idée, au pire ya pas moyen de faire un fetch_assoc plutot qu'un fetch_array, avec un retour de données plus explicite genre:

while($data = mysql_fetch_assoc($req))
{
$nom_commercial = $data['commerciaux']['nom']
$prenom_commercial = $data['commerciaux']['prenom'];
$civilite_client = $data['clients']['civilite'];
$nom_client = $data['clients']['nom'];
$prenom_client = $data['clients']['civilite'];
$region = $data['regions']['libelle'];
}

au moins yaurrai pas de confusion possible
0
cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 3
14 juin 2007 à 13:14
si tu a utiliser la meme requete que sur le lien donner tu a essayer de mettre $region = $data['libelle'] au lieu de $region = $data['regions']['libelle']
ce n'est qu'une idee
0
shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013
14 juin 2007 à 16:10
ouai mais certains champs on les mêmes noms, exemple:
-id est dans commerciaux, mais aussi dans clients et dans région, ce n'est pas le même mais c'est toujours un id, donc il ne saurra pas comment le traiter :s
0
cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 3
14 juin 2007 à 16:46
$result=mysql_query("select clients.nom as 'nomClient',clients.prenom as 'prenomClient',commerciaux.nom as 'commercialNom',commerciaux.prenom as 'commercialPrenom'
,regions.libelle as 'Region' from clients, commerciaux, regions where clients.commercial_id=commerciaux.id and commerciaux.region_id=regions.id");
 while ($data=mysql_fetch_array($result)){
     echo $data['Region'];
    echo $row['clientNom']. $row['clientPrenom']." :: (".$row['commercialNom'].$row['commercialPrenom'].")
";
 }

je pense quand mettant ce code ca devrait fonctionner et si tu ve rajouter les id tu dois les renomee avec as dans la requete pour pouvoir les distingue
0
shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013
14 juin 2007 à 17:14
toujours pas :s, voici ce que ca me retourne:s,  j'commence a désespérer lol

Rhône-Alpes :: ()
Rhône-Alpes :: ()
Auvergne :: ()
Auvergne :: ()
Auvergne :: ()
Auvergne :: ()
Provence-Alpes-Côte-d'Azur :: ()

ca aurrait du retourner
Rhône-Alpes
client1 :: son commercial
clien2 :: son commercial

Auvergne
client1 :: son commercial
....
....
...
0
cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 3
14 juin 2007 à 17:34
peut ut me donner deux  ligne retourner par taje vais faire des test et je te tiens au courant
0
cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 3
14 juin 2007 à 17:49
Je viens de tester avec la meme structure de base que tu a donner dans ton premier post j'ai mis un client bidon un commercial bidon et une region et avec ce code ca me retourne bien le resultat que tu souhaite :

$req = mysql_query('SELECT clients.nom as "nom_client",clients.prenom as "prenom_client",commerciaux.nom as "nom_commercial",commerciaux.prenom as "prenom_commercial",libelle as "region" from clients,commerciaux,regions where clients.commercial_id=commerciaux.id and commerciaux.region_id=regions.id');
while($data = mysql_fetch_array($req)){
    echo $data['region']."
";
    echo $data['nom_client']." ".$data['prenom_client']." :: ".$data['nom_commercial']." ".$data['prenom_commercial'];
    echo "
";
}
j'espere que ca va fonctionner
0
shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013
14 juin 2007 à 22:51
Ok, on avance, MAIS encore un tout petit problême de formatage, ca me met ce que tu peux voir juste au dessous, sauf que le but serrait d'afficher par région, en gros toutes les donées de la même régions sont ensemble, les rhones alpes dans rhone alpes, les auvergne dans auvergne ... au lieu de remettre plusieurs fois la région:
Rhône-Alpes
Vito Paul :: Vincent Mickael

Rhône-Alpes
Dermel Sylvie :: Vincent Mickael

Auvergne
Bazille Nicolas :: Martin Alain

Auvergne
Dutey Florian :: Martin Alain

Auvergne
Guert Francoise :: Martin Alain

Auvergne
Parvy Julie :: Bernard Juliette

Provence-Alpes-Côte-d'Azur
Kohut Irene :: Zerick Thierry
0
cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 3
15 juin 2007 à 00:35
tu peux utiliser deux requete differente une premier pour selectionner toutes les region et lorsque tu parcour ce resultat tu recherche tous les commerciaux et les client car je ne sai pas en une seule requete c possible
0
cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 3
15 juin 2007 à 08:40
ou alor tu peux faire un order by dans ta requete et verifier a chaque debut de boucle si la region et la meme si ce n'est pas la meme tu la reecrit sinon tu continus d'ecrir les client et commerciaux
voila j'esper avoir pu t'aider
0
shadow1779 Messages postés 706 Date d'inscription mercredi 17 novembre 2004 Statut Membre Dernière intervention 29 septembre 2013
15 juin 2007 à 09:12
ok la normal ca marche, j'aurrai préféré une jointure des 3 tables mais tant pis, sinon au fait pourrai tu me montrer  (si tu sais biensur) comment on fait un foreach, j'crois que ca doit etre possible plutot qu'un while, en asp.net on s'en sert pas mal, des truc du genre

foreach(client in clients)
{
// La requete qui lie commerciaux et les clients, ca eviterai de faire un while dans un while
}
0
cs_sebastien_et_typh Messages postés 289 Date d'inscription jeudi 5 octobre 2006 Statut Membre Dernière intervention 11 juin 2010 3
15 juin 2007 à 10:17
je vais rechercher ca car je l'ai deja utiliser mais je sais plus de trop sinon au lieu de faire un while dans un while tu peux faire :

region="";
while(...){
if (region!=data[...]){
    region = data[...];
    affiche region;
}
affiche client commerciau
 je te tiendraisau courant pour foreach
0
Rejoignez-nous