|
|
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']; |
|
 |