AllesMeins: /MySQL: Gemeinsamkeiten von Usern finden

Hi,

folgende Situation. Ich habe hier eine Datenbank mit Musikstücken. Sie besteht aus 3 (relevanten) Tabellen:

1.) userTitel: Welche Titel hat ein User eingegeben (eindeutige Zuordnung über UserId und TitelId)
2.) titel: Welcher Künstler hat den Titel gemacht (und weiterer Informationen zum Titel, die nicht weiter relevant sind). Eindeutige Zuordnung über titelId und künstlerId
3.) künstler: Informationen über die jeweiligen Künstler

Was ich nun erhalten möchte ist eine Liste mit allen Paaren von Usern, die einen oder mehrere Künstler gemeinsam gehört haben und optimalerweise noch eine Liste mit den gemeinsamen KünstlerIds. Hier geht es um relativ große Tabellen (bis zu 50 Millionen Einträge), ich müsste das also so weit wie möglich direkt in MySQL lösen um nicht all zu viel vom Server zum Client schieben zu müssen. Genauso will ich natürlich auch interne "Riesen-Joins" soweit es geht vermeiden.

Ich brauch also etwas Hilfe beim erstellen dieses Querys - als Ausgangspunkt habe ich mir schon mal etwas gebastelt, das aber sicherlich weder hübsch noch effizient ist:

SELECT * FROM (SELECT userId, artistId FROM userTitel LEFT JOIN titel USING (titelId) GROUP BY artistId, userId) as t1 JOIN (SELECT userId, artistId FROM userTitel LEFT JOIN titel USING (titelId) GROUP BY artistId, userId) as t2 ON t1.artistId = t2.artistId

Bin ich damit auf einem richtigen Weg?
Kann ich irgendwie den Doppelten Query in den Sub-Selects vermeiden? Ist ja unsinnig den zweimal auszuführen
Was kann man noch machen um das ganze effizient zu bekommen oder geht es ganz anders viel besser?

  1. Hi,

    als Ausgangspunkt habe ich mir schon mal etwas gebastelt, das aber sicherlich weder hübsch noch effizient ist:

    Stimmt, hübsch ist das nicht; könntest du also bitte diese Query erst mal über mehrere Zeilen schreiben und sinnvolle Einrückungen verwenden, und mit [code lang=sql] formatieren - dann wird das ganze für die Teilnehmer hier lesbarer und leichter erfassbar.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1.   
      SELECT *  
      FROM  
         (SELECT userId, artistId  
          FROM userTitel LEFT JOIN titel  
          USING (titelId)  
          GROUP BY artistId, userId) as t1  
      JOIN  
         (SELECT userId, artistId  
          FROM userTitel LEFT JOIN titel  
          USING (titelId)  
          GROUP BY artistId, userId) as t2  
      ON t1.artistId = t2.artistId