假设我有一个基于时间的数据集,它包含如下数据数组:

{
   "group": "a", "date": "2017/01/01", value: 0.01
},
{
   "group": "a", "date": "2017/01/02", value: 0.02
}

如何生成这样的结果集:
{
    "group": "a", value_sum: 0.03, timeline: [["2017/01/01", 0.01], ["2017/01/02", 0.02]]
}

等等。
我使用的是雄辩的orm,目前我坚持使用两种不同的查询模式,第一种是为每个不同的组求和:
SELECT group, sum(value) FROM table GROUP BY group

第二个是了解趋势:
SELECT group, date, sum(value) FROM table GROUP BY group, date

然后在php中合并这两个结果集。
我正在寻找一种在一个查询中获得所有结果的方法

最佳答案

您可以尝试使用rollup执行GROUP BY

SELECT
    `group`, date, sum(value)
FROM table
GROUP BY
    `group`, date
WITH ROLLUP

在拉腊维尔:
DB::table('table')
    ->select('`group`', 'date', DB::raw('sum(value) as sumval'))
    ->groupBy(DB::raw('`group`, date WITH ROLLUP'))
    ->get();

您可以查看MySQL documentation以了解group by和rollup是如何工作的。对于查询的当前结构,rollup将为每个group的值的小计生成额外的行。此外,结果集的底部将有一个总计行。虽然您也可以通过两个单独的查询实现相同的功能,但是您可能会发现让mysql为您做繁重的工作更容易。毕竟,它是为这个目的而创造的。
另一个注意事项:不要将列命名为group,因为这是一个保留的mysql关键字。另外,不要命名表table。也许你只是用这些名字作为占位符,但如果不是,你将不得不逃避他们无处不在。

关于php - 使用php/eloquent/mysql分组和嵌套数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46645838/

10-11 22:36
查看更多