2017-02-02 38 views
2

使用这个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

一个简单的方法是使用的最大值过滤器(在这种情况下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 
+0

这个方法看起来不错,但我有一个附近的语法错误:'HAVING成功=( SELECT SUM(heroes.likes) FROM heroebymovie JOIN he'第6个 –

+0

@MarieDeschamps错误的顺序按位置..回答更新 – scaisEdge

+0

这个请求中有一个额外的右括号 – mounaim

0

你正在寻找一个极限,但要考虑关系的having子句。 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 
); 
相关问题