分组后查出count()为零的字段

1.需求:

想要统计出camille1,camille2,camille3,camille4每个人都有几件衣服,没有衣服的就为0件。

数据表(clothes)

idnamecolor
1camille1blue
2camille2blue
3camille2red
4camille4yellow
5camille4blue

数据表(user)

idname
1camille1
2camille2
3camille3
4camille4

2.实现

  • a.一般情况我们会这样写SQL语句:

SELECT `name`, count(*) AS clothes_count FROM `clothes` WHERE `name` IN (‘camille1’, ‘camille2’, ‘camille3’,‘camille4’) GROUP BY `name`

但是结果为
不理想的输出结果
从输出结果看少了这条数据

nameclothes_count
camille30
  • b.实际SQL应当这样写:
    以原来查询出来的结果作为一个子表然后leftjoin这个子表查出我们想要的结果

SELECT DISTINCT a. name, IFNULL(b.clothes_count, 0) AS clothes_count FROM `user` AS a LEFT JOIN(
SELECT `name`, count(*) AS clothes_count FROM `clothes` WHERE`name` IN (‘camille1’, ‘camille2’, ‘camille3’,‘camille4’) GROUP BY `name`
) AS b ON `a`.`name` = `b`.`name` WHERE `a`.`name` IN (‘camille1’, ‘camille2’, ‘camille3’,‘camille4’)

想要的输出结果

3.用Laravel框架来实现上述SQL语句

//查询出计数为零的字段
   public function index(){
       $name = ['camille1','camille2','camille3','camille4'];
       $clothesQuery = new Clothes();
       $clothesCountObj = $clothesQuery->selectRaw('count(*) as clothes_count, name')
           ->whereIn('name', $name)
           ->groupBy('name');
       //为了返回结果有计数为零的字段
       $clothes = DB::table('user as a')
           ->select(DB::raw('IFNULL( b.clothes_count, 0 ) AS clothes_count,a.name'))
           ->distinct()
           ->whereIn('a.name', $name)
           ->leftJoin(\DB::raw("({$clothesCountObj->toSql()}) as b"), function ($join) use ($clothesCountObj) {
               $join->mergeBindings($clothesCountObj->getQuery())->on('a.name', '=', 'b.name');
           })
           ->get();
       return $clothes;
   }

框架输出结果

4.解惑

解惑

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值