hotti: PHP Doppelte Spaltennamen bei JOIN in MySQL

Beitrag lesen

moin,

ich möchte alles ein bisschen automatisieren. da wäre es schön wenn irgend so was rauskommt: $obj->user->name oder $obj->usergroup->name

Genau dafür gibt es ja den alias (auch im Plural). Gerade bei joins ist der alias so wichtig, weil bei einem select * die resultierenden Feldnamen nicht eindeutig sind.

Am besten kannst Du Dich mit joins vertraut machen, wenn Du eine Tabelle mit sich selbst joinst, nehmen wir mal an, die Tabelle 'public' hat die Felder 'ent', 'att', 'val'. Jetz joinen wir mal die Tabelle mit sich selbst, schon allein dafür müssen wir einen alias auf den Tabellen-Namen setzen, sagen wir, a und b:

  
select  
*  
from public a  
join public b using(ent,att,val)  

using(ent,att,val) heißt nun: Für den join müssen alle Felder übereinstimmen. Das Ergebnis entspricht der ursprünglichen Tabelle und doppelte Feldnamen treten nicht auf. Nun ein Feld aus der join-Bedingung raus, using(ent,att):

  
select  
*  
from public a  
join public b using(ent,att)  

Jetzt sehen wir doppelte Feldnamen: ent att val val
Weiter gehts mit using(ent), wir sehen im Result die Felder: ent att val att val

Ergo: Sollen die Feldnamen eindeutig sein, müssen wir den Alias verwenden. Beispiel:

  
select  
  
a.ent as entity,  
b.val as title,  
c.val as short,  
d.val as class  
  
from public a  
join public b using(ent,att)  
join public c using(ent)  
join public d using(ent)  
  
where b.att='title' and c.att='short' and d.att='class'  

Wir haben nun im Resultat die Spaltennamen: entity, title, short, class
und praktisch heiß das: Genau dieselben Namen finden sich als Attribute in Deinen Objekten wieder. Vorausgesetzt, in Deiner Prgrammiersprache gibt es Methoden, die sowas entsprechend umsetzen (Perl ist hierzu sehr komfortabel).

Installier Dir einen Query-Browser, lege eine Tabelle an und spiel mal ein bischen mit Self-joins. Beobachte auch die Anzahl der Zeilen, Du siehst sehr anschaulich, wie das Kreuzprodukt entsteht.

Schöne Grüße.