I’m trying to get just top 3 selling products grouped within categories (just top 3 products by occurrence in transactions (id) count(id)
by each category). I was searching a lot for possible solution but with no result. It looks like it is a bit tricky in MySQL since one can’t simply use top() function and so on. Sample data structure bellow:
+--------+------------+-----------+ | id |category_id | product_id| +--------+------------+-----------+ | 1 | 10 | 32 | | 2 | 10 | 34 | | 3 | 10 | 32 | | 4 | 10 | 21 | | 5 | 10 | 100 | | 6 | 7 | 101 | | 7 | 7 | 39 | | 8 | 7 | 41 | | 9 | 7 | 39 | +--------+------------+-----------+
Advertisement
Answer
In earlier versions of MySQL, I would recommend using variables:
select cp.* from (select cp.*, (@rn := if(@c = category_id, @rn + 1, if(@c := category_id, 1, 1) ) ) as rn from (select category_id, product_id, count(*) as cnt from mytable group by category_id, product_id order by category_id, count(*) desc ) cp cross join (select @c := -1, @rn := 0) params ) cp where rn <= 3;