php - Laravel 查询按两个不同的日期分组

标签 php mysql laravel-5

假设我正在搜索输入变量: $从:01-01-2016 $到:03-12-2016

这是我当前的表格:(outreach_links)

created_at   start_date     status 
---------------------------------
2016-12-01   2016-01-01    A
2016-12-02   2016-02-01    A
2016-12-03   2016-03-01    A
2016-12-03   2016-04-01    A
2016-12-03      NULL       P
2016-12-03      NULL       P
2016-12-03      NULL       P

查询后我想这样输出>>

Month          P        A
---------------------------
Jan/2016       0        1
Feb/2016       0        1
March/2016     0        1
April/2016     0        1
Dec/2016       3        0

逻辑是我想按 created_at 对 Status = "P"进行分组 我想按 start_date 对 Status="A"进行分组?我如何在查询中完成此操作?

这是我当前的 laravel 5.2 查询:

DB::select(
    DB::raw('select 
        sum(case when outreach_links.status="P" and outreach_links.created_at >= ? and outreach_links.created_at <=? then 1 else 0 end) as pp,
        sum(case when outreach_links.status="A" and outreach_links.start_date >= ? and outreach_links.start_date <=? then 1 else 0 end) as aa,
        sum(case when outreach_links.status="A" then outreach_links.cost else 0 end) as cc,
        MONTH(outreach_links.created_at) month,
        MONTHNAME(outreach_links.created_at) month_name,
        YEAR(outreach_links.created_at) year from outreach
        inner join outreach_links on outreach.id = outreach_links.outreach_id
        where outreach.profile_id=?
        group by month, year'),
    [$from, $to, $from, $to, $pro_id]
);

由于我仅按 (created_at) 分组,所以此输出是错误的:

    Month          P        A 
    ---------------------------
    Dec/2016       3        4

这是我查询时的输出 >> var_dump();

array(1) {
  [0]=>
  object(stdClass)#369 (6) {
    ["pp"]=>
    string(1) "3"
    ["aa"]=>
    string(1) "4"
    ["cc"]=>
    string(4) "0.00"
    ["month"]=>
    string(2) "12"
    ["month_name"]=>
    string(8) "December"
    ["year"]=>
    string(4) "2016"
  }
}

你能帮我修改查询吗?

谢谢

最佳答案

这样就可以了:

select concat(monthname(date), '/', year) as Month,
(select count(*) from test where year(created_at) = year and month(created_at) = month and status = 'P') as P,
(select count(*) from test where year(start_at) = year and month(start_at) = month and status = 'A') as A
from
(select year(created_at) as year, month(created_at) as month, created_at as date
from test where created_at >= ? and created_at <= ?
union
select year(start_at) as year, month(start_at) as month, start_at as date
from test where start_at >= ? and start_at <= ?) t1
group by year, month
order by date

基本上,它UNION 该表中的所有日期,并在此基础上执行分组依据

这是 SQL Fiddle .

关于php - Laravel 查询按两个不同的日期分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40921386/

相关文章:

php - CodeIgniter 中是否有一个函数可以将数据库查询结果的所有行作为单个数组获取?

php - 如何删除数组中的重复项

MySQL AFTER 更新触发器与 New.col<> OLD.col

python - 美丽汤webscrape进入mysql

jquery - 让 Laravel 返回 JSON

php - 需要在单个资源 Controller 中使用 Entrust 角色的建议 - Laravel5

javascript - jquery ajax html 警报中的 "\r\n\"

php - 如何调试 PHP 中的 MySQL 错误?

javascript - jQuery RadialIndicator auto(无需刷新页面)基于值

javascript - Dropzone.js 可以用来上传音乐和视频文件吗?