如何对查询的数据进行二次分组??

关于项目开发过程中,在数据表的设计阶段,对某一个表a的字段进行设计,包括id,name,创建时间和状态。
首先根据我业务需求,我需要对数据进行按时间分组,这一步可以实现,附上代码:
(我使用的是php原生的数据库查询语句)

$data = $request->getQueryParams();                                   
$from = $data['from'];                                                
$to = $data['to'];                                                    
$res = Plan::query()                                                  
    ->where('user_id',$userid)                                        
    ->where('status','!=',-1)                                         
    ->whereBetween('create_time',[$from,$to])                         
    ->selectRaw('DATE_FORMAT(create_time,"%Y-%m-%d") as date')        
    ->selectRaw('COUNT(*) as count')                                  
    ->groupBy('date')                                                 
    ->orderBy('date','desc')                                          
    ->get();                                                             

数据返回格式:

[
    {
        "date": "2018-10-21",
        "count": "2"
    },
    {
        "date": "2018-10-20",
        "count": "2"
    }
]

紧接着,我想设计另一种查询方式,也是我的需求,因为我的字段中设计status状态字段,状态可能为0,1,-1.我对数据过滤掉-1的,主要是我想在日期分组的条件下,再进行对status的分组,也就是二次分组,预期的数据结果是:
(over统计的是为status1的,no统计的是status为0的)
{

    "date": "2018-10-21",
    "over": 3,
    "no": 1

}
但是我没有想到好的解决办法,希望可以提供思路与代码

阅读 2.8k
2 个回答
Plan::query()                                                  
    ->where('user_id', $userId)                                        
    ->where('status', '!=', -1)                                         
    ->whereBetween('create_time', [$from, $to])                         
    ->selectRaw('DATE_FORMAT(create_time, "%Y-%m-%d") AS date')        
    ->selectRaw('COUNT(*) AS count')
    ->selectRaw('status')                                      
    ->groupBy('date', 'status')                                      
    ->orderBy('date', 'desc')                                          
    ->get();                                                             
Plan::query()                                                  
    ->where('user_id', $userId)                                        
    ->where('status', '!=', -1)                                         
    ->whereBetween('create_time', [$from, $to])                         
    ->selectRaw('DATE_FORMAT(create_time, "%Y-%m-%d") AS date')        
    ->selectRaw('SUM(IF(status=1, 1, 0)) AS over')
    ->selectRaw('SUM(IF(status=0, 1, 0)) AS no')
    ->groupBy('date')                                      
    ->orderBy('date', 'desc')                                          
    ->get();                                                             

既然状态只有三种(0,1,-1),而-1已经过滤,所以结果集中只有状态0和1
所以SUM(status)其实就是status=1的条数,用COUNT(*)减去SUM(status)就是status=0的条数

// 查询追加字段
->selectRaw('SUM(status) as over') 

// 数据返回
[
    {
        "date": "2018-10-21",
        "count": "2",
        "over": "1",
    },
    {
        "date": "2018-10-20",
        "count": "2",
        "over": "0",
    }
]

// 遍历结果,count - over = no
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题