我的数据库中有两个表,分别是评级和电影。
评分:
| id | movie_id | rating |
影:
| id | title |
典型的电影记录可能是这样的:
| 4 | Cloverfield (2008) |
并且Cloverfield可能有几个评级记录,如下所示:
| 21 | 4 | 3 |
(评分号码21,电影号码4,评分为3)
| 22 | 4 | 2 |
(评分号码22,电影号码4,评分为2)
| 23 | 4 | 5 |
(电影号码4的评分数为23k,评分为5)
问题:
如何创建JOIN查询,仅选择影视表中评级表中评级数超过x
的行?例如,在上面的示例中,如果Cloverfield在评级表中只有一个评级且x
为2,则不会选择它。
感谢您提供任何帮助或建议!
答案 0 :(得分:7)
使用HAVING子句。这些方面的东西:
SELECT movies.id, movies.title, COUNT(ratings.id) AS num_ratings
FROM movies
LEFT JOIN ratings ON ratings.movie_id=movies.id
GROUP BY movies.id
HAVING num_ratings > 5;
答案 1 :(得分:3)
你可能想要使用MySQL的HAVING子句
http://www.severnsolutions.co.uk/twblog/archive/2004/10/03/havingmysql
答案 2 :(得分:2)
JOIN方法有些笨拙且令人困惑,因为这并不是它的目的。最直接的(在我看来,易于人类解析的)方法使用EXISTS:
SELECT whatever
FROM movies m
WHERE EXISTS( SELECT COUNT(*)
FROM reviews
WHERE movie_id = m.id
HAVING COUNT(*) > xxxxxxxx )
大声朗读 - 从电影中选择一些东西在评论中,在movie_id匹配的地方有EXIST行,并且有> xxxxxx行
答案 3 :(得分:1)
SELECT * FROM movies
INNER JOIN
(SELECT movie_id, COUNT(*) as num_ratings from ratings GROUP BY movie_id) as movie_counts
ON movies.id = movie_counts.movie_id
WHERE num_ratings > 3;
这只会让你获得超过3个评级的电影,实际上获得它的评级将需要另一个加入。子查询优于HAVING的优点是您可以同时聚合评级。如(SELECT movie_id,COUNT(*),AVG(评级)为average_move_rating ......)
编辑:糟糕,您可以使用having方法进行聚合。 :)
答案 4 :(得分:0)
上述解决方案适用于您提到的方案。我的建议可能对你的想法有些过分,但对其他情况可能很方便:
子查询只有那些来自评级表的数量超过您需要的数量(再次使用tha group by having子句):
通过具有计数(*)>的movie_id从评级组中选择movie_id X
将子查询加入电影表
选择movies.id 来自电影加入 如Movies.id = MoviesWRatings.movie_id
当您在子查询中执行更多操作时,这可能会有所帮助。 (不确定语法是否适合MySQL,如有必要请修复。)