如何只显示结果表的多个最大值?

时间:2017-02-02 13:20:27

标签: mysql sql

在我的数据库中使用此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”和“复仇者联盟”)。 有人可以解释这样做的方式吗?

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 OVERMAX(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
);