当前位置:首页 > PHP > 正文内容

Laravel带条件查询多个count

陈杰2年前 (2021-01-26)PHP5491

在一个数据表中,我们需要用到聚合函数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();

查询出来的结果是:

image.png


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

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

那就说一下另外一种方法


第二种方法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();

打印结果

image.png

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


同样,我们计算到了该贴作者的经验值,我们同样可以计算到该帖子的好中差评的准确计数

$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();

打印结果

image.png



扫描二维码至手机访问

扫描二维码推送至手机访问。

版权声明:本文由何烦过虎溪发布,如需转载请注明出处。

转载请注明出处:http://95shouyou.com/?id=33

分享给朋友:

相关文章

laravel分表model映射的思路

预先估计会出现大数据量并且访问频繁的表,将其分为若干个表这种预估大差不差的,论坛里面发表帖子的表,时间长了这张表肯定很大,几十万,几百万都有可能。 聊天室里面信息表,几十个人在一起一聊一个晚上,时间长...

laravel个推设置别名

laravel个推设置别名

上一篇文章我们说过了怎么用laravel接个推的官方sdk实现个推推送和厂商离线推送,因为我们要用到别名推送,而前端又用到的是unipush,在前端去绑定别名的难度肯定要大一点,所以就有一个思路就是,...

通过代码创建多个同样的mysql表

在分库分表中可能要同时创建多个结构相同但后缀不同的表,通过代码实现for ($i = 3; $i <= 20; $i++) {    DB::connection('...

lavel对接个推别名推送

lavel对接个推别名推送

新项目采用uniapp开发,需要用到推送功能,之前接过极光,其中的一些坑都踩过了,但是unipush用的是个推的推送,那就只有重写踩坑了。composer  require&nbs...

Lumen框架报错Cannot declare class Event, because the name is already in use

Lumen框架报错Cannot declare class Event, because the name is already in use

Lumen框架报错信息Cannot declare class Event, because the name is already in use(1/1) ErrorExceptionCa...

利用workerman实现webrtc实时音视频通话

利用workerman实现webrtc实时音视频通话

实现原理利用workerman的websocket实现实时消息传递。webrtc自带p2p功能,利用STUN中继服务器实现webrtc实时音视频看看我们的前端文件,只是一个单页面<html>...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。