在我的数据库中使用此MySQL查询:
SELECT movie.name, SUM(heroes.likes) AS 'success'
FROM heroebymovie JOIN
heroes
ON heroes.ID = heroebymovie.heroID JOIN
movie
ON movie.ID = heroebymovie.movieID
GROUP BY movie.ID
ORDER BY SUM(heroes.likes) DESC
我得到了这个结果:
|name |success |
|Avengers 2 |72317559 |
|Avengers |72317559 |
|Captain America : Civil War|67066832 |
我想只显示“成功”次数最多的电影(本例中为“复仇者联盟2”和“复仇者联盟”)。 有人可以解释这样做的方式吗?
答案 0 :(得分:2)
一种简单的方法是使用一个过滤最大值的having子句(在这种情况下是sum desc limit 1的有序列表)
SELECT movie.name, SUM(heroes.likes) AS success
FROM heroebymovie JOIN heroes ON heroes.ID = heroebymovie.heroID
JOIN movie ON movie.ID = heroebymovie.movieID
GROUP BY movie.ID
HAVING success = (
SELECT SUM(heroes.likes)
FROM heroebymovie JOIN heroes ON heroes.ID = heroebymovie.heroID
JOIN movie ON movie.ID = heroebymovie.movieID
GROUP BY movie.ID
ORDER BY SUM(heroes.likes) DESC
LIMIT 1
)
ORDER BY SUM(heroes.likes) DESC
答案 1 :(得分:0)
您正在寻找限制,但想要考虑关系。 MySQL支持LIMIT
子句,但遗憾的是没有附带关系表达式。
在标准SQL中,您只需添加
即可FETCH 1 ROW WITH TIES;
并完成它。 (SQL Server对TOP(1) WITH TIES
执行相同的操作。)
另一种方法是使用标准SQL MAX OVER
:MAX(SUM(heroes.likes)) OVER()
,并且只保留总和与最大值匹配的行。或者使用RANK OVER
。但同样,MySQL并不支持其中任何一种。
所以你的主要选择是执行两次查询,就像在这个伪代码中一样:
select sum ... having sum = (select max(sum) ...)
获取MySQL中最大总和的一种简单方法是按降序排序,并将结果限制为一行。
SELECT m.name, SUM(h.likes) AS "success"
FROM heroebymovie hm
JOIN heroes h ON h.ID = hm.heroID
JOIN movie m ON m.ID = hm.movieID
GROUP BY m.ID
HAVING SUM(h.likes) =
(
SELECT SUM(h2.likes)
FROM heroebymovie hm2
JOIN heroes h2 ON h2.ID = hm2.heroID
GROUP BY hm2.movieID
ORDER BY SUM(h2.likes) DESC
LIMIT 1
);