因此,我们为影片评级提供了以下关系数据库:
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个共同条目的那些?
答案 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')