Jointure

Signaler
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013
-
Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
-
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

Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
3
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..
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

ouai mais comment je retourne mes values ensuite afin de formater ma page comme je l'ai mise :s
Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
3
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
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

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)
Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
3
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?
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

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
Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
3
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
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

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
Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
3
$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
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

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
....
....
...
Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
3
peut ut me donner deux  ligne retourner par taje vais faire des test et je te tiens au courant
Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
3
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
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

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
Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
3
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
Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
3
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
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

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
}
Messages postés
289
Date d'inscription
jeudi 5 octobre 2006
Statut
Membre
Dernière intervention
11 juin 2010
3
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