larvel mysql count,Laravel带条件查询多个count

在一个数据表中,我们需要用到聚合函数count来查询符合条件的总数。

举例一个场景:

我们有一个帖子,这个帖子可以分别被好中差评,好中差评记录用一个单独的记录表来存储。

如果用户点击好评,那么该帖子作者的经验值就+1,中评就不做操作,点了差评就把作者的经验值-1。

同理:该帖子被点击了好中差评,该帖子的好中差评的计数也会相应的发生改变。

那么按照常规的办法就是:

当用户点击了好评,我们去评价数据库查询到点击好评的个数,再去查点击差评的个数,他们一相减就是用户的经验值了

好评的查询条件为where('evaluate', 1),差评的查询条件为where('evaluate', 3)。就是评价表的字段evaluate来存储是好评还是差评。$exp_interview =

MemberEvaluateModel::query()

->where('return_id', $model['member_id'])

->whereIn('type', [2, 3])

->where('evaluate', 1)

->count()

-

$exp_interview2 = MemberEvaluateModel::query()

->where('return_id', $model['member_id'])

->whereIn('type', [2, 3])

->where('evaluate', 3)

->count();

我们发现,这里做了两次数据查询的动作,这样写肯定是行得通的,而且好理解,但是是不是感觉就不太对啊?

为什么要去做两次操作?直接一步查出来不行吗?直接带条件查询多个count多好?

下面介绍两种方法

第一种groupBy$exp_shen = MemberEvaluateModel::query()->where('return_id',$model['member_id'])

->whereIn('type', [1, 4])

->selectRaw("evaluate,COUNT(*) as exp")

->groupBy("evaluate")

->get()->toArray();

查询出来的结果是:

d66aabdf00f11e8a8acb943de368874c.gif

这里还需要我们去遍历一下,把两个值相减一下就能得到我们想要的实际经验值了。

遍历我们就不说了,感觉还是有点麻烦啊

那就说一下另外一种方法

第二种方法DISTINCT$exp_interview =

MemberEvaluateModel::query()

->where('return_id', $model['member_id'])

->whereIn('type', [2, 3])

->selectRaw("COUNT(DISTINCT IF(evaluate=1,id,NULL)) - COUNT(DISTINCT IF(evaluate=3,id,NULL)) as exp")

->first();

打印结果

d66aabdf00f11e8a8acb943de368874c.gif

这样就知道得到了我们想要的经验值,所以第二种方法更简单快捷。

同样,我们计算到了该贴作者的经验值,我们同样可以计算到该帖子的好中差评的准确计数$like_count = MemberEvaluateModel::query()

->where("pid", $model['id'])

->where("type", $params['type'])

->selectRaw("COUNT(DISTINCT IF(evaluate=1,evaluate,NULL)) as number_like,COUNT(DISTINCT IF(evaluate=2,evaluate,NULL)) as number_medium,COUNT(DISTINCT IF(evaluate=3,evaluate,NULL)) as number_hate")

->first();

打印结果

d66aabdf00f11e8a8acb943de368874c.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值