如何创建MySQL JOIN查询以仅选择一个表中的行,其中对该行的一定数量的引用存在于另一个表中?

时间:2008-10-06 19:11:15

标签: sql mysql

我的数据库中有两个表,分别是评级电影

评分:

  

| 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,则不会选择它。

感谢您提供任何帮助或建议!

5 个答案:

答案 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)

答案 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)

上述解决方案适用于您提到的方案。我的建议可能对你的想法有些过分,但对其他情况可能很方便:

  1. 子查询只有那些来自评级表的数量超过您需要的数量(再次使用tha group by having子句):

    通过具有计数(*)>的movie_id从评级组中选择movie_id X

  2. 将子查询加入电影表

    选择movies.id 来自电影加入   如Movies.id = MoviesWRatings.movi​​e_id

  3. 上的MoviesWRatings

    当您在子查询中执行更多操作时,这可能会有所帮助。 (不确定语法是否适合MySQL,如有必要请修复。)