[英]MYSQL, Max,Group by and Max
我有以下两张桌子。
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
在输出中,Rating和Genre是正确的,但Movie_Name不正确。
任何人都可以建议我应该做出哪些改变,以获得正确的电影名称以及评级和流派。
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表
流派表
Movie_Genre表
这是一个常见的MySQL问题 - 在聚合查询中指定非聚合/非聚合的列。 其他SQL版本不允许你这样做,并会警告你。
当您执行类似于您的查询时,您正在选择聚合组中的非聚合列。 由于许多行共享相同的类型,因此当您选择Movie_Name
它会从每个组中随机选取一行并显示该行,因为没有通用算法来猜测您想要的行并返回其值。
你可能会问'为什么随意挑选? 它可以选择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
这将使用子查询选择评级与该类型的最大评级相同的行。
查询:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.