KNeo: MySQL Benutzertabelle und Benutzereigenschaften verknüpfen

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 ;)

  1. 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

    1. 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)

      1. 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