PRATIQUE OUTILS 
Résoudre une ambiguïté de table SQL
 
Faire un bon usage des alias pour se tirer des tables qui s'entrecroisent. (15/12/2005)
  Forum

Réagissez dans les forums de JDN Développeurs

Il est courant de désigner ses tables selon l'objet qu'elles représentent : Personne, Marque, Ville... Il est ainsi possible de créer des liaisons plus simples et utilisant moins de tables que si chacune était trop spécialisée : par exemple, Personne peut désigner un client ou un vendeur si l'on ajoute le champ adéquat, et évite de devoir passer par une table Vendeur et une autre Client, et les redondances possibles.

Un problème surgit dès que, dans une même requête, deux lignes d'une table sont nécessaires. Comme exemple, prenons une table Personne, une autre Projet, et une autre Pers2Proj. Chacun personne peut proposer un projet, et choisir un projet proposé, la table Pers2Proj se chargeant de faire la liaison.

Pour afficher un tableau reprenant l'ensemble des propositions et des choix, il nous faut donc non seulement afficher la personne qui a proposé le projet, mais aussi celle qui l'a choisi. Sans les alias, difficile de faire la part des choses : SQL ne prendra qu'une personne en compte.

On veut afficher "Untel a proposé TEL PROJET, qui a été choisi par TEL AUTRE".

SELECT Personne.prenom, Projet.nom, Personne.prenom
FROM Personne, Projet, Pers2Proj
WHERE Personne.id = Pers2Proj.id_pers AND Pers2Proj.id_proj = Projet.id AND Personne.id = Pers2Proj.choisipar
GROUP BY Projet.nom
ORDER BY Personne.id ASC


Comme l'on peut s'y attendre, seule une personne sera prise en compte par cette requête. La solution se trouve donc du côté les alias. La commande AS permet non seulement de simplifier des requêtes longues, mais également de préciser une cible :

SELECT pe1.prenom AS 'Proposition', pr.nom AS 'Projet', pe2.prenom AS 'Selection'
FROM Personne AS pe1, Projet AS pr, Pers2Proj AS p2p, Personne AS pe2
WHERE pe1.id = p2p.id_pers AND p2p.id_proj = pr.id AND pe2.id = p2p.choisipar
GROUP BY pr.nom
ORDER BY pe1.id ASC


On traite ainsi de deux manières différentes une même table : Personne avec pe1, et Personne avec pe2. De même en PHP, les alias nous permettent de réaliser un appel plus juste :

echo $row_TousProjets['Proposition'];
echo $row_TousProjets['Projet'];
echo $row_TousProjets['Selection'];
 
Xavier Borderie, JDN Développeurs
 
 
Accueil | Haut de page