MYSQL,Max,Group by和Max

时间:2013-03-28 10:50:57

标签: mysql sql greatest-n-per-group

我有以下两张表。

1.电影细节(电影ID,电影名称,评级,投票,年份)

2.Movie类型(电影ID,流派)

我使用以下查询来执行连接并获得每个中评分最高的电影 流派。

select Movie_Name, 
    max(Rating) as Rating,
    Genre from movie_test 
inner join movie_genre 
where movie_test.Movie_ID = movie_genre.Movie_ID 
group by Genre

在输出中,评级和流派是正确的,但Movie_Name不正确。

任何人都可以建议我应该做出哪些更改,以获得正确的电影名称以及评级和流派。

3 个答案:

答案 0 :(得分:3)

SELECT  g.*, d.*
FROM    MovieGenre g
        INNER JOIN MovieDetail d
            ON g.MovieID = d.MovieID
        INNER JOIN
        (
            SELECT  a.Genre, MAX(b.Rating) maxRating
            FROM    MovieGenre a
                    INNER JOIN MovieDetail b
                        ON a.MovieID = b.MovieID
            GROUP   BY a.Genre
        ) sub ON    g.Genre = sub.Genre AND
                    d.rating = sub.maxRating

您的架构设计有问题。如果Movie可以包含多个Genre以及Genre可以包含在许多Movie上,那么它应该是一个三表设计。

MovieDetails表

  • MovieID(PK)
  • 的movieName
  • MovieRating

流派表

  • GenreID(PK)
  • GenreName

Movie_Genre表

  • MovieID(FK) - 具有GenreID的复合主键
  • GenreID(FK)

答案 1 :(得分:0)

这是一个常见的MySQL问题 - 在聚合查询中指定非聚合/非聚合的列。其他版本的SQL不允许您这样做并会警告您。

当您执行与您类似的查询时,您正在选择聚合组中的非聚合列。由于许多行共享相同的类型,因此当您选择Movie_Name时,它会从每个组中随机选取一行并显示该行,因为没有通用算法来猜测您想要的行并返回该值。 / p>

您可能会问'为什么随意挑选?它可以选择max(Rating)所属的那个?但是其他聚合列呢,比如avg(Rating)呢?它在那边挑了几排?如果两行具有相同的最大值怎么办?因此,它不能有一个算法来选择一行。

要解决此类问题,您必须重新构建查询,例如:

select Movie_Name, 
    Rating,
    Genre from movie_test mt
inner join movie_genre 
where movie_test.Movie_ID = movie_genre.Movie_ID 
and Rating = (select max(Rating) from movie_test mt2 where mt.Genre = mt2.Genre
group by Genre
limit 1

这将使用子查询选择评级与该类型的最大评级相同的行。

答案 2 :(得分:0)

查询:

SELECT t.Movie_Name,
       t.Rating,
       g.Genre
FROM movie_test t
INNER JOIN movie_genre g ON t.Movie_ID = g.Movie_ID
WHERE t.Movie_ID = (SELECT t1.Movie_ID 
                    FROM movie_test t1
                    INNER JOIN movie_genre g1 ON t1.Movie_ID = g1.Movie_ID
                    WHERE g1.Genre = g.Genre
                    ORDER BY t1.Rating DESC
                    LIMIT 1)