我要求按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"
}
]
]
}
答案 0 :(得分:4)
与下面的图片类似
您可以考虑在从查询中获得结果后对其进行格式化。它已经归还给你一个集合。您可以将->groupBy('c_date')->values()
添加到集合中以检索给定结果。如果您删除->values()
部分,则会将分组日期保留为关键字。
答案 1 :(得分:2)
更改
count(affiliate_ad=1)
到
SUM(affiliate_ad=1)
如果你想计算' affiliate_ad
为1
的行数。
也就是说,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中的聚合,例如SUM
或MAX
等。
你可以这样做,虽然我还没有测试过,当你从数据库中获取结果时,请执行以下操作:
$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>