按结果分组为多维数组

时间:2018-01-13 09:10:00

标签: php mysql laravel laravel-5 group-by

我要求按created_date分组数据,然后再次在affiliate_ad上搜索此结果集数据。我正在使用这个

 return DB::table($this->table)
      ->whereRaw($where['rawQuery'], isset($where['bindParams']) ? $where['bindParams'] : array())
      ->select('id', 'created_date','affiliate_ad', DB::raw('count(*) as total,count(affiliate_ad=1) as affiliate_ad_count,SUBSTRING(`created_date`, 1, 10) AS c_date'))
      ->groupBy('affiliate_ad','c_date')
      ->orderBy('c_date', 'desc')
      ->get();

它给我这样的结果

 Collection {#385
   #items: array:18 [
    0 => {#386
      +"id": 354766
      +"created_date": "2018-01-10 10:16:27"
      +"affiliate_ad": 1
      +"total": 2
      +"affiliate_ad_count": 1
      +"c_date": "2018-01-10"
    }
    1 => {#384
      +"id": 354730
      +"created_date": "2018-01-10 10:10:39"
      +"affiliate_ad": 0
      +"total": 3
      +"affiliate_ad_count": 4
      +"c_date": "2018-01-10"
    }
    2 => {#387
      +"id": 338263
      +"created_date": "2018-01-08 10:10:52"
      +"affiliate_ad": 0
      +"total": 83
      +"affiliate_ad_count": 83
      +"c_date": "2018-01-08"
    }
  ]
}

如果您检查,在前两个索引中,创建的日期是相同的。所以我想将它们分组在0th索引的一个数组索引中,multidimensional array分组在affiliate_ad上。实际查询构建为

SELECT id
     , created_date
     , affiliate_ad
     , COUNT(*) total
     , COUNT(affiliate_ad = 1) affiliate_ad_count
     , SUBSTRING(created_date,1,10) c_date 
  FROM facebook_ad 
 WHERE facebook_id = 12345 
   AND reward_status = 0 
   AND (first_seen BETWEEN 0 AND 99999999) 
 GROUP 
    BY affiliate_ad
     , c_date 
 ORDER 
    BY c_date desc

我需要像这样的输出

Collection {#385
   #items: array:18 [
    0 => [
        0 => {#386
          +"id": 354766
          +"created_date": "2018-01-10 10:16:27"
          +"affiliate_ad": 1
          +"total": 2
          +"affiliate_ad_count": 1
          +"c_date": "2018-01-10"
       }
       1 => {#384
          +"id": 354730
          +"created_date": "2018-01-10 10:10:39"
          +"affiliate_ad": 0
          +"total": 3
          +"affiliate_ad_count": 4
          +"c_date": "2018-01-10"
        }
    ]
    1 => [
        0 => {#387
          +"id": 338263
          +"created_date": "2018-01-08 10:10:52"
          +"affiliate_ad": 0
          +"total": 83
          +"affiliate_ad_count": 83
          +"c_date": "2018-01-08"
        }
   ]
  ]
}

我在mysql中有这些数据 MySql Data Screenshot

6 个答案:

答案 0 :(得分:4)

与下面的图片类似

enter image description here

您可以考虑在从查询中获得结果后对其进行格式化。它已经归还给你一个集合。您可以将->groupBy('c_date')->values()添加到集合中以检索给定结果。如果您删除->values()部分,则会将分组日期保留为关键字。

答案 1 :(得分:2)

更改

count(affiliate_ad=1)

SUM(affiliate_ad=1)

如果你想计算' affiliate_ad1的行数。

也就是说,COUNT忽略你在parens中放入的内容,除非它是一列。在这种情况下,它会计算该列NOT NULL的行数。 COUNT(DISTINCT col)做了不同的事情。

SUM(expression)评估表达式并将值相加。如果expression是布尔值(例如,affiliate_ad=1),那么TRUE被视为1,而FALSE被视为0.因此,它会为您提供' count'你可能想要。

注意NULLs如何计算/总结/平均。

答案 2 :(得分:1)

评论太长了,但需要考虑的事情......

SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT COUNT(*) FROM ints;
+----------+
| COUNT(*) |
+----------+
|       10 |
+----------+

SELECT COUNT(i=1) FROM ints;
+------------+
| COUNT(i=1) |
+------------+
|         10 |
+------------+

答案 3 :(得分:1)

看作id是唯一的,您单独选择它,它不会在您的结果中分组。如果您需要个人ID以及您要返回的其他数据,我建议您使用GROUP_CONCAT(id)

请点击此处了解详情:https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

不确定这是否完全回答了您的问题,但希望它能帮助您指明正确的方向。

答案 4 :(得分:1)

return DB::table($this->table)
      ->whereRaw($where['rawQuery'], isset($where['bindParams']) ? $where['bindParams'] : array())
      ->select('id', 'created_date','affiliate_ad', DB::raw('count(*) as total,count(affiliate_ad=1) as affiliate_ad_count,SUBSTRING(`created_date`, 1, 10) AS c_date'))
      ->groupBy('affiliate_ad','c_date')
      ->orderBy('c_date', 'desc')
      ->get()->groupBy('affiliate_ad');

如果您在 config / database.php 更改

中出错,这将对您有用
strict => false,

答案 5 :(得分:1)

您希望使用group by的方式仅适用于MySQL中的聚合,例如SUMMAX等。

你可以这样做,虽然我还没有测试过,当你从数据库中获取结果时,请执行以下操作:

$results->groupBy('affiliate_ad');

foreach ($results as $i => $ad_group) {
    foreach ($ad_group as $items) {
        $results[$i] = (new Collection($items))->groupBy('c_date');  
    }
}

注意:根据Laravel DB的版本返回一个数组或Collection对象,如果它在您的版本中返回一个数组,则将其放入集合对象中,如new \Illuminate\Support\Collection($results) < / p>