2017-02-25 122 views
-1

我正在使用Sakila DB在MySQL中練習我的技能。總結後得到組的前n行

我會創建一個名爲rentals_customer_store_film_category的視圖,它是客戶,付款,租賃,電影和類別表的聯合。 我現在想通過收入獲得前5名電影。這意味着我會撒謊總結每個電影的所有收入,然後返回第一個5. 我嘗試了下面的代碼,但它不起作用。 我無法弄清楚它有什麼問題 有什麼幫助嗎?

SELECT store_id, film_id, income 
FROM 
(SELECT film_id, store_id, sum(amount) as income, 
    @store_rank := IF(@current_store = store_id, @store_rank + 1, 1) AS store_rank, 
    @current_store := store_id 
FROM rentals_customer_store_film_category 
group by store_id, film_id 
ORDER BY store_id, income DESC, film_id 
) ranked 
WHERE store_rank <= 5 

下面的結果。正如你所看到的,它並不停止在每個商店的第五排。它顯示存儲的所有電影,而我想只有前5店:店面ID 2.

store_id film_id income 
1 971 134.82 
1 879 132.85 
1 938 127.82 
1 973 123.83 
1 865 119.84 
1 941 117.82 
1 267 116.83 
1 327 110.85 
1 580 106.86 
1 715 105.85 
1 897 104.85 
... 
... 
... 
... 
2 878 127.83 
2 791 127.82 
2 854 123.83 
2 946 117.86 
2 396 113.81 
2 369 111.84 
2 764 110.85 
2 260 110.84 
2 838 110.82 
2 527 109.83 
2 893 106.84 
2 71 102.87 
2 8 102.82 
... 
... 
... 
... 
+0

幫助我們爲您提供幫助 - 請分享一些示例數據和您試圖獲得的結果。 – Mureinik

+0

完成。對不起,以前沒有做過。 – user3623123

回答

1

在這種情況下的順序很重要以前的STORE_ID與當前比較ID爲1,前5名,試試這個:

SELECT store_id, film_id, income 
FROM 
(SELECT film_id, store_id, sum(amount) as income, 
     #First compare previus with current 
    @store_rank := IF(@prev_store = store_id, @store_rank + 1, 1) AS store_rank, 
    #asign previus store 
    @prev_store := store_id 
FROM films 
group by store_id, film_id 
ORDER BY store_id, income DESC, film_id 
) ranked 
WHERE store_rank <= 5