MySQL Benutzertabelle und Benutzereigenschaften verknüpfen
KNeo
- datenbank
0 mrjerk
Hallo,
ich habe eine MySQL tabelle mit Benutzern (id, name) und eine separate Tabelle mit Eigenschaften die den Benutzern optional zugeordnet werden können (id, userid, property, value)
Nehemn wir an, meine Tabellen seine so gefüllt:
Benutzer:
| id | name |
|--------------|
| 1 | u1 |
| 2 | u2 |
| 3 | u3 |
Eigenschaften:
| id | userid | property | value |
|-------------------------------------|
| 1 | 1 | 'icq' | '12345' |
| 2 | 1 | 'skype' | 'dummy' |
| 3 | 1 | 'msn' | 'u@msn.de' |
| 4 | 2 | 'icq' | '98765' |
| 5 | 2 | 'skype' | 'bob' |
Dann hätte ich gerne mit einem Query eine Ausgabe wie folgt:
| id | name | icq | skype | msn |
--------------------------------------------------
| 1 | u1 | '12345' | 'dummy' | 'u@msn.de' |
| 2 | u2 | '98765' | 'bob' | NULL |
| 3 | u3 | NULL | NULL | NULL |
Leider weiß ich nicht, wie ich eine derartige Verknüpfung der Tabellen in einem bekomme. Ist das überhaupt möglich?
Ziel ist es, jederzeit Eigenschaften für die User hinzufügen zu können und innerhalb des Queries dann auch nach diesen sortieren zu können.
Das Query darf die Namen der Spalten enthalten - diese müssen nicht wirklich dynamisch entstehen. Ich kann das Query schon anhand der möglichen Eigenschaftennamen dynamisch zusammensetzen.
Bin für jeden Denkanstoß dankbar ;)
Hallo,
eine erste Lösung wäre vielleicht sowas:
SELECT
user.id AS id,
user.name AS name,
icq.value AS icq,
skype.value AS skype,
msn.value AS msn
FROM user
LEFT JOIN eigenschaften icq ON user.id=eigenschaften.userid
LEFT JOIN eigenschaften skype ON user.id=eigenschaften.userid
LEFT JOIN eigenschaften msn ON user.id=eigenschaften.userid
Bin mir aber fast sicher, dass das auch noch eleganter geht, irgendwie ;)
Viele Grüße,
Jörg
Hoppla vertippt:
LEFT JOIN eigenschaften icq ON user.id=eigenschaften.userid
LEFT JOIN eigenschaften skype ON user.id=eigenschaften.userid
LEFT JOIN eigenschaften msn ON user.id=eigenschaften.userid
muss heissen:
LEFT JOIN eigenschaften icq ON user.id=icq.userid
LEFT JOIN eigenschaften skype ON user.id=skype.userid
LEFT JOIN eigenschaften msn ON user.id=msn.userid
(da ja ein Tabellenalias für eigenschaften benutzt wird)
LEFT JOIN eigenschaften icq ON user.id=icq.userid
LEFT JOIN eigenschaften skype ON user.id=skype.userid
LEFT JOIN eigenschaften msn ON user.id=msn.userid
Bis auf eine Kleinigkeit:
~~~sql
LEFT JOIN eigenschaften icq ON user.id=icq.userid AND icq.property = 'icq'
LEFT JOIN eigenschaften skype ON user.id=skype.userid AND skype.property = 'skype'
LEFT JOIN eigenschaften msn ON user.id=msn.userid AND msn.property = 'msn'
So geht's dann auch :)
Ich danke vielmals für die Hilfe!
Es ist zwar ein leichtes soein Query mit PHP zu erzeugen, aber trotzdem ist noch etwas lang... Falls jemand noch eine simplere Variante einfällt, wär das super :D