复杂查询:查找评分为u1的至少2部普通电影的所有用户

时间:2014-09-30 01:56:11

标签: mysql sql

因此,我们为影片评级提供了以下关系数据库:

  mysql> select * from ratings;
+-----+-----+------+
| uid | mid | rid  |
+-----+-----+------+
| u1  | m1  |    4 |
| u1  | m2  |    3 |
| u2  | m2  |    5 |
| u2  | m3  |    4 |
| u3  | m1  |    4 |
| u3  | m2  |    5 |
| u3  | m3  |    2 |
+-----+-----+------+
7 rows in set (0.03 sec)

因此,我们希望找到所有已评定至少2部普通电影的用户,这些电影是由特定用户评定的电影' u1'。换句话说,如果用户' u1'已评级电影m1,m2,m3我们想要所有其他人的用户ID,这些用户也评价了至少2部电影m1,m2,m3。

所以在这种情况下,答案应该是u3,因为u3已经评定了m1,m2,m3,其中包括2个带有' u1'的普通电影。我尝试了以下声明:

mysql> SELECT * 
       FROM ratings 
       WHERE mid IN (SELECT mid FROM ratings WHERE uid='u1');


+-----+-----+------+
| uid | mid | rid  |
+-----+-----+------+
| u1  | m1  |    4 |
| u1  | m2  |    3 |
| u2  | m2  |    5 |
| u3  | m1  |    4 |
| u3  | m2  |    5 |
+-----+-----+------+
5 rows in set (0.00 sec)

所以,这给了我与用户u1一样的普通电影的所有评分。现在,我怎样才能获得与u1至少有2个共同条目的那些?

3 个答案:

答案 0 :(得分:2)

SELECT R.uid from ratings R
JOIN
(SELECT distinct mid  
 FROM ratings 
 WHERE uid='u1') T
ON R.mid = T.mid
group by R.uid
having count(R.mid) = 2;

+-----+
| uid |
+-----+
| u1  |
| u3  |
+-----+
2 rows in set (0.15 sec)

答案 1 :(得分:1)

此表单的查询将返回指定的结果。

SELECT o.user_id 
  FROM ( SELECT COUNT(DISTINCT u.movie_id) AS cnt
           FROM ratings u
          WHERE u.user_id = '1234'
       ) c
 CROSS
  JOIN ( SELECT m.user_id
              , m.movie_id
           FROM ratings m
          WHERE m.user_id = '1234'
          GROUP
             BY m.user_id
              , m.movie_id
       ) n
  JOIN ratings o
    ON o.movie_id = n.movie_id
   AND o.user_id <> n.user_id 
 GROUP
    BY o.user_id
HAVING COUNT(DISTINCT o.movie_id) = c.cnt

内联视图c会返回指定用户评分的电影数量。

内联视图n返回指定用户评定的movie_id的不同列表。

o的加入会返回相同电影的评分中的所有行。连接谓词(在ON子句中)对movie_id列中的值执行“匹配”,并排除指定用户的行。

GROUP BY将行折叠为不同的user_id。

HAVING子句将指定用户评级的电影“计数”与其他用户评定的相同电影数量的“计数”进行比较,并删除未评级所有用户的行数指定用户评分的电影。

答案 2 :(得分:0)

SELECT userid 
FROM ratings 
WHERE movieid in (SELECT movie_id FROM ratings WHERE userid='1234')