我有一份报告表,我想按创建日期对它们进行分组。 每个都有创建的字段,即datetime。
我试过这样做:
$reports = $this->Report->find('all', array(
'recursive' => 0,
'group' => 'DATE(created)'
));
返回了正确数量的组(3因为我有很多记录,但目前只有3个不同的日期),但它只返回每组一个记录。 正如@Kai回答的那样,sql grouping也将返回一条独特的记录。
我想显示一个结果表,其中一个表格标题将每个分组日期的结果分开。实现这一目标的最佳CakePHP方法是什么?
答案 0 :(得分:1)
我认为你在mysql中得到GROUP BY
和ORDER BY
的概念很困惑。
分组
GROUP BY
仅在某些情况下才有意义。例如,如果您的表中包含具有类别和价格的产品,并且您希望获得每个类别的最高价格的产品。如果您只使用SELECT MAX(price) FROM products
,您将获得表中最昂贵的产品。那是GROUP BY
的来源:SELECT MAX(price) FROM products GROUP BY category_id
。在GROUP BY
中指定的列中,GROUP BY
将始终为每个唯一值获取一行。在我的示例中,这意味着使用GROUP BY
,每个类别ID将获得一行,因此我将能够看到每个类别的最高价格。
按订单排序
ORDER BY
非常自我解释 - 它会按照您指定的列对结果进行排序。
所以,回到你的问题,你应该使用ORDER BY
,而不是GROUP BY
。
$reports = $this->Report->find('all', array(
'recursive' => 0,
'order' => 'DATE(created)'
));
ETA: 至于创建结果表,每个日期用表头分隔,继续进行,就好像要创建没有这些分隔符的常规表一样,但将日期保存在临时变量的第一行中。每次迭代,检查您的临时变量对该行的日期。如果行的日期不同,请插入标题,并将临时变量更新为当前行的日期。这里有一些伪代码可以帮助澄清:
echo '<table>';
//echo your first set of headers.
$temp = $report[0]['Report']['created'];
foreach($data as $report)
{
if($temp != $report['Report']['created'])
{
//echo your headers
$temp = $report['Report']['created'];
}
//echo your row of data here.
}
echo '</table>';