使用php / eloquent / mysql分组和嵌套数组

时间:2017-10-09 11:54:10

标签: php mysql laravel eloquent

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

{
   "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]]
}

等等。

我正在使用Eloquent ORM,我现在坚持使用一种模式,我可以在其中创建两个不同的查询,第一个获取每个不同组的总和:

SELECT group, sum(value) FROM table GROUP BY group

和获得趋势的第二个:

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

然后我合并了php中的两个结果集。

我正在寻找一种方法来在一个查询中获得所有结果

1 个答案:

答案 0 :(得分:1)

您可以尝试使用汇总GROUP BY

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

在Laravel:

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

您可以查看MySQL documentation,了解如何使用汇总分组。对于查询的当前结构,汇总将为每个group的值的小计生成额外的行。此外,结果集底部会有一个总行。虽然 也可以通过两个单独的查询实现相同的功能,但您可能会发现让MySQL更轻松地为您完成繁重的工作。毕竟,它是为了这个目的而创建的。

另一个注意事项:不要为列group命名,因为这是一个保留的MySQL关键字。另外,不要为表格table命名。也许您只是将这些名称用作占位符,但如果不是,您将不得不在任何地方逃避它们。