Bonjour à tous,
J'aimerais soulever deux ou trois problèmes de jointures dont on ne parle pas souvent.
Je vous le fait sous forme d'énoncé qui pourrait s'apparenter à la vie
courante comme ça ce sera clair pour tout le monde .
Problème 1 : Nous disposons d'une table clients, chaque client représente une société qui peut contenir plusieurs contacts, plusieurs adresses de facturations, et avec lequel nous pouvons naturellement travailler sur plusieurs dossiers.
Nous appelerons nos tables : clients, contacts, adresses, dossiers.
Nous définissons une architecture simpliste :
- clients.ID
- clients.NOCLIENT
(jointure)
- clients.NOM
- contacts.ID
- contacts.NOCLIENT
(jointure)
- contacts.NOM
- contacts.TEL
- adresses.ID
- adresses.NOCLIENT
(jointure)
- adresses.ADR1
- adresses.ADR2
- adresses.CP
- adresses.VILLE
- dossiers.ID
- dossiers.NOCLIENT
(jointure)
- dossiers.NOM
Question : Comment faire une requête qui nous permet de sélectionner
à la fois toutes les commandes d'un client, toute ses adresses et tout
ses contacts sans avoir de doublons.
En gros, lorsque nous faisons des jointures les une derriere les autres
avec des objets qui ont une relation d'appartenance avec d'autres
objets, pas de problème.
Il est facile de faire une jointure CLIENT -> DOSSIER -> FACTURE
quand on considère qu'une facture appartient à un dossier et qu'un
dossier appartient à un client . On peut dire que la facture appartient
au client.
Mais dans notre problème, le contact n'appartient pas nécéssairement
au dossier.
Si nous rédigeons notre requête avec une jointure externe de droite à gauche comme ceci : CLIENT -> DOSSIERS -> CONTACT
Nous obtiendrons un résultat comme ça :
Code : Tout sélectionner
clients.NOM | dossiers.NOM | contacts.NOM
SARL BOB | XY12 | Mr duchemol
SARL BOB | XY13 | Mr duchemol
SARL BOB | XY12 | Mr bernard
SARL BOB | XY13 | Mr bernard
SARL BOB | XY12 | Mr jacques
SARL BOB | XY13 | Mr jacques
Vous voyez le problème ?
L'idéal serait de pouvoir récuperer à partir d'une seule requête des variables PHP comme ceci :
$res['dossiers.NOM'][0] = XY12
$res['dossiers.NOM'][1] = XY13
$tab['contacts.NOM'][0] = Mr duchemol
$tab['contacts.NOM'][1] = Mr bernard
$tab['contacts.NOM'][2] = Mr Jacques
Pour ce faire nous aurions besoin d'une requête qui donnerai comme
resultat :
- clients.NOM | dossiers.NOM | contacts.NOM
SARL BOB | XY12 | Mr duchemol
SARL BOB | XY13 | Mr bernard
SARL BOB | NULL | Mr jacques
Car on se fout un peut de faire tomber en face les contacts et les dossiers
puisque dans notre situation il ne sont pas en relation.
Ainsi nous pourrions faire une boucle php sur chaque élément :
// LISTE LES CONTACTS D'UN CLIENT
$i=0;
while ($res['contacts.NOM'][$i] != "NULL")
{
echo "<br>$res['contacts.NOM'][$i]";
$i++;
}
// LISTE LES DOSSIERS D'UN CLIENT
$i=0;
while ($res['dossiers.NOM'][$i] != "NULL")
{
echo "<br>$res['dossiers.NOM'][$i]";
$i++;
}
Résultats que nous devrions obtenir avec les adresses en plus :
- clients.NOM | dossiers.NOM | contacts.NOM | adresses.CP
SARL BOB | XY12 | Mr duchemol | 75015
SARL BOB | XY13 | Mr bernard | NULL
SARL BOB | NULL | Mr jacques | NULL
Alors dans un premier temps pouvez-vous me dire comment rédiger
ma requête, sur quoi je dois m'orienter (GROUP BY ??) ou peut-être
comment améliorer mes jointures pour obtenir le résultat final souhaité ?
Allez un deuxième tout petit problème de jointures pour la route :
Lorsque nous utilisons une jointure externe, même s'il n'existe
pas de champs correspondant dans la deuxième table, les champs
de la première table sont affichés et ceux de la deuxième transformés
en valeur NULL.
(ex basé sur architecture en haut de ce post : SELECT clients.NOM,
contacts.NOM FROM clients LEFT OUTER JOIN contacts ON
clients.NOCLIENT = contacts. NOCLIENT where
clients.NOM = 'SARL BOB' )
Dans l'hypothèse où l'on a pas enregistré de contact pour la SARL BOB
la reqûete avec jointure externe va retourner :
SARL BOB | NULL
Si l'on avait utilisé la jointure interne, la requête nous aurais retourné :
"RIEN DU TOUT"
Mon problème est de me retrouver avec une valeur NULL
au lieu d'avoir une valeur par défaut dans ma table.
Je souhaiterai obtenir par exemple :
SARL BOB | Aucun contact
Mais NULL c'est nul !!
Ma question est la suivante : Est ce que Mysql garde les valeurs par défaut
où est ce qu'il transforme systématiquement tout en NULL.
Ma question concerne tout les type de champs (ENUM surtout).
Merci de votre aide et désolé pour la lecture.