2010-08-14 14 views
5

Ich habe 2 Tabellen, 'Interessen' und 'Benutzer_Interessen'.Wie Sie ähnliche Interessen in MySQL zählen

'users_interests' hat nur userid und interestid Felder. 'Interessen hat nur eine id und eine name.

Ich brauche einfach Benutzer-IDs zu finden, die mehr als 3 Interessen IDs gemeinsam haben. Mir wurde gesagt, dass ein Self Join involviert ist, aber ich kann es nicht funktionieren lassen.

Jemand sagte, so etwas wie dies funktionieren könnte:

SELECT 
     others.userid 
    FROM interests AS user 
    JOIN interests AS others 
     USING(interestid) 
    WHERE user.userid = 2 
    GROUP BY 
     others.userid 
    ORDER BY COUNT(*) DESC 

Aber ich habe kein Glück mit ihm.

Antwort

5
SELECT ui.userid, COUNT(*) AS common_interests 
FROM users_interests ui 
WHERE ui.interestid IN (
    SELECT ui2.interestid FROM users_interests ui2 WHERE ui2.userid = 2 
) 
AND ui.userid <> 2 
GROUP BY ui.userid 
HAVING common_interests > 3; 

Hinweis das Auftreten des userid wir auf unserer Suche sind stützen (2) an zwei Stellen im Code

+0

Amazing! Danke dafür, das funktioniert wunderbar! – Ryan

2

Sie sagten mehr als 3 Interesse IDs gemeinsam, so meinst du "mindestens 4", richtig?

SELECT first1.userid, second1.userid 
FROM users_interests first1, users_interests second1, 
    users_interests first2, users_interests second2, 
    users_interests first3, users_interests second3, 
    users_interests first4, users_interests second4 
WHERE 
    first2.userid=first1.userid AND first3.userid=first1.userid AND first4.userid=first1.userid AND 
    second2.userid=second1.userid AND second3.userid=second1.userid AND second4.userid=second1.userid AND 
    first1.userid<>second1.userid AND 
    first1.interestid=second1.interestid AND 
    first2.interestid=second2.interestid AND first2.interestid<>first1.interestid AND 
    first3.interestid=second3.interestid AND first3.interestid<>first2.interestid AND first3.interestid<>first1.interestid AND 
    first4.interestid=second4.interestid AND first4.interestid<>first3.interestid AND first4.interestid<>first2.interestid AND first4.interestid<>first1.interestid 

Da ich nicht getestet haben, vergessen Sie, dass es in ihm Fehler sein kann, so dass es nur verwenden, wenn Sie es verstehen.

Wenn Sie das gleiche für andere Zahlen von Interessen gemeinsam benötigen, bin ich sicher, dass Sie Code schreiben können, um diese Abfrage für eine beliebige Zahl dynamisch zu generieren. Wenn Sie das Interesse Namen benötigen, bin ich sicher, dass Sie in der Lage sein werden, die erforderlichen vier Joins zur interests Tabelle hinzuzufügen und die relevanten Spalten der SELECT-Klausel hinzuzufügen.