2016-04-25 10 views
2

Ich versuche, ein grundlegendes kollaboratives Filterempfehlungssystem mit MySQL zu erstellen. Ich habe eine Tabelle User-Bewertung wie folgt aus:Zurückgeben von Zeilen mit einem anderen Benutzer in SQL gemeinsam (Collaborative Filtering)

user_id movie_id rating 
1 131  342  3  <<< User 131 has rated movie 342 
2 131  312  5  <<< and also 312 
3 122  312  4 
4 213  342  5 
5 141  342  5  <<< User 141 has rated 342 
6 141  312  4  <<< and also 312 (2 movies in common) 
7 141  323  3 

So ähnliche Benutzer Ich versuche, 131. ich die Benutzer zurückkehren wollen zu finden, die mindestens zwei Filme gemeinsam haben und die Bewertungen sind oben 3. So Es sollte Zeilen 5 und 6 (wie oben gezeigt) zurückgeben.

Dies ist, was ich bisher:

SELECT * from user_ratings 
WHERE rating >= 3 
AND movie_id IN (SELECT movie_id from user_rating WHERE user_id = 131) 
AND user_id != 131 

Das gibt:

user_id movie_id rating 
3 122  312  4  <<< Don't want these two 
4 213  342  5  <<< 
5 141  342  5  
6 141  312  4  

Es Filme gibt, die Benutzer mit 131 gemeinsam haben, aber ich brauche es nur um die Benutzer zu zeigen, die mindestens zwei Elemente gemeinsam haben. Wie könnte ich das tun? Ich bin nicht sicher, wie es weitergehen :(

Antwort

1

Sie können zuerst den user_id s finden, die mit rating > 3 mehr oder gleicher Anzahl von Filmen wie user_id = 131 haben dann IN in der WHERE Klausel verwenden, um die zusätzlichen Daten zu erhalten.

SQL Fiddle

SELECT * 
FROM user_ratings 
WHERE 
    user_id IN(
     SELECT user_id 
     FROM user_ratings 
     WHERE 
      movie_id IN (SELECT movie_id FROM user_ratings WHERE user_id = 131) 
      AND rating > 3 
     GROUP BY user_id 
     HAVING 
      COUNT(*) >= (SELECT COUNT(*) FROM user_ratings WHERE user_id = 131) 
    ) 
    AND rating > 3 
+0

Danke, genau das, was ich gesucht habe! –

0

Sie einen Self-Join auf movie_id verwenden können, um eine Liste von benutzerkennungen zu erhalten, die bei einer Bewertung von 4 oder höher bei mindestens 2 der gleichen Filme wie Benutzer 131 bewertet haben:

select ur2.user_id 
from user_ratings ur1 
join user_ratings ur2 
    on ur2.movie_id = ur1.movie_id 
    and ur2.user_id <> ur1.user_id 
where ur1.user_id = 131 
    and ur2.rating > 3 
group by ur2.user_id 
having count(*) >= 2 

http://sqlfiddle.com/#!9/06b56/4