mysql 求和后得到group的前n行

y1aodyip  于 2023-05-28  发布在  Mysql
关注(0)|答案(1)|浏览(143)

我正在使用Sakila DB练习我在MySQL中的技能。
我会创建一个名为rentals_customer_store_film_category的视图,其中包含customers、payments、rentals、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 1和前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
...
...
...
...
js5cn81o

js5cn81o1#

在这种情况下,顺序对于比较前一个store_id和当前的store_id很重要,尝试以下操作:

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

相关问题