查找用户拥有多少匹马? PostgreSQL查询

问题描述

我有四个表:用户,订单,份额和马匹。

一个用户有很多订单,一个订单有很多份额,一匹马有很多份额。

我想查找特定用户拥有的每匹马的份额(包括用户拥有特定马匹的零份额时)。

我尝试了以下方法,但是当用户对特定马匹拥有零份额时,我无法检索到这种情况。

$userHorses = DB::table('orders')->join('shares','orders.id','=','shares.order_id')
          ->join('horses','horses.id','shares.horse_id')
          ->where('orders.user_id',$user_id)
          ->select('horses.name','horses.slug',DB::raw('count(*) as totalShares'))
          ->groupBy('horses.name','horses.slug')
          ->get();

return $userHorses;

解决方法

要检索所有具有用户共享数的马,您将需要使用条件聚集之类的左联接,

$userHorses = DB::table('horses h')
          ->leftJoin('shares s','h.id','=','s.horse_id')
          ->leftJoin('orders o','o.id','s.order_id')
          ->select('h.name','h.slug',DB::raw('sum(case when o.user_id = :user_id then 1 else 0 end) as totalShares',['user_id' => $user_id])
          )
          ->groupBy('h.name','h.slug')
          ->get();