我正在使用Laravel,并有一个音乐表,一个order_items表和一个用户表。音乐项目都具有用户,并且用户可以具有多个音乐项目。我想要获得前100名销售音乐,但我想每个用户只返回一个音乐项目(他们所有音乐销售中最畅销的一个)。
我的代码是:
$items = DB::table('order_items')
->join('music', 'music.id', '=', 'order_items.music_id)
->groupBy('music_id')
->select('order_items.user_id', 'order_items.music_id', DB::raw('count(*) as sold'))
->orderBy(DB::raw('sold_count'), 'desc');
$items = collect($items)->unique('user_id')->values()->take(100);
这似乎返回了我需要的数据,但是第一个查询返回超过35K的记录,因此需要一段时间才能运行。我可以对初始查询设置限制,但是我不能保证一旦按用户分组就会有100个项目。
有更好的方法吗?可以在一个查询中运行吗?