2017-02-02 36 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 
); 
相關問題