[erledigt][SQL] wie joinen bzw. wie performant lösen

TTPlayer

Well-known member
ID: 18200
L
1 Mai 2006
219
10
Hi @all,

hab ein kleines Problem mit meinen Tabellen und sitz grad irgendwie auf dem Schlauch.
Tabelle 1 beinhaltet User, jeweils mit einer ID. Tabelle 2 beinhaltet Eigenschaften dieser User. Als Fremdschlüssel die UserID, dann die Eigenschaft (z.b. Vorname, Nachname, Straße, etc.). Eigenschaften kann jeder User mehrere haben, es gibt in Tabelle 2 also mehrere Einträge pro User.

Nun möchte ich alle User mit Vornamen und Nachnamen in einer Liste ausgeben. Bin nun auf der Suche nach der besten, sprich schnellsten Lösung. Kann mir einer weiterhelfen?

TTPlayer
 
Zuletzt bearbeitet:
Da gibts doch nicht viele Möglichkeiten. Einfach alle abrufen und an die anderen Tabelle rüberJOINen:
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] [/FONT][FONT=Courier New]properties.userid[/FONT][FONT=Courier New], [/FONT][FONT=Courier New]properties.[/FONT][FONT=Courier New]name, [/FONT][FONT=Courier New]properties.[/FONT][FONT=Courier New]value
[B][COLOR=#9932cc]FROM[/COLOR][/B] properties
[B][COLOR=#9932cc]JOIN[/COLOR][/B] users [B][COLOR=#9932cc]USING[/COLOR][/B](userid)
[B][COLOR=#9932cc]WHERE[/COLOR][/B] [/FONT][FONT=Courier New]properties.[/FONT][FONT=Courier New]name [B][COLOR=#9932cc]IN[/COLOR][/B] ('forename', 'surname');[/FONT]
Wenn du aus der Usertabelle gar nichts brauchst - wie in meiner Abfrage -, kannst du dir den JOIN an die Usertabelle sogar ganz sparen und nur aus den Eigenschaften rauslesen.
 
Zuletzt bearbeitet:
Ein Benutzer hat mehrere Namen? :ugly:

Ich vermute mal deine 2. Tabelle sieht in etwa wie folgt aus:
ID | userid | vorname | nachname |

oder meinst du sowas?
ID | userid | eigenschaftsid | eigenschaftswert |
Sowas wäre meiner Meinung nach aber schon viel zu stark normalisiert, um performant zu sein.

Zur 1. Variante:
Code:
SELECT t1.xxx, t2.vorname, t2.nachname FROM t1 INNER JOIN t2 ON t2.userid = t1.id
 
Ja, Johnson ich meine tatsächlich die zweite Variante. Wenn das ganze in ein CMS eingebaut ist macht eine so starke normalisierung aber durchaus Sinn. Dass man dann evtl. abstriche in der Performanz machen muss ist mir auch klar.

Danke für eure Hilfe. mausiWenn euch auch keine innovativen Möglichkeiten einfallen mach ich das wohl so. Gibt zwar ein bischen unschönen PHP-Code drumrum, aber da muss ich mich dann wohl mit abfinden.
 
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] [/FONT][FONT=Courier New]properties.userid[/FONT][FONT=Courier New], [/FONT][FONT=Courier New]properties.[/FONT][FONT=Courier New]name, [/FONT][FONT=Courier New]properties.[/FONT][FONT=Courier New]value
[B][COLOR=#9932cc]FROM[/COLOR][/B] properties
[B][COLOR=#9932cc]JOIN[/COLOR][/B] users [B][COLOR=#9932cc]USING[/COLOR][/B](userid)
[B][COLOR=#9932cc]WHERE[/COLOR][/B] [/FONT][FONT=Courier New]properties.[/FONT][FONT=Courier New]name [B][COLOR=#9932cc]IN[/COLOR][/B] ('forename', 'surname');[/FONT]


Damit hast Du aber dann zwei Zeilen pro User. Eine mit
UserID "Vorname" Wert und eine mit
UserID "Nachname" Wert.

Wenn er alles in einer Zeile haben will braucht TTPlayer mehr als einen Join.

PHP:
SELECT p.???, u1.wert AS vorname, u2.wert AS nachname
FROM properties p
INNER JOIN users u1
ON p.ID = u1.userID
AND u1.eigenschaft = 'Vorname'
INNER JOIN users u2
ON p.ID = u2.userID
AND u2.eigenschaft = 'Nachname';


vorausgesetzt, für jeden Nutzer sind beide Werte immer gespeichert,
sonst muss der INNER JOIN jeweils durch einen LEFT OUTER JOIN ersetzt werden