CakePHP将datetime转换为date和group results

时间:2014-06-24 15:15:06

标签: mysql sql cakephp datetime

我有一份报告表,我想按创建日期对它们进行分组。 每个都有创建的字段,即datetime。

我试过这样做:

    $reports = $this->Report->find('all', array(
      'recursive' => 0,
      'group' => 'DATE(created)'
    ));

返回了正确数量的组(3因为我有很多记录,但目前只有3个不同的日期),但它只返回每组一个记录。 正如@Kai回答的那样,sql grouping也将返回一条独特的记录。

我想显示一个结果表,其中一个表格标题将每个分组日期的结果分开。实现这一目标的最佳CakePHP方法是什么?

1 个答案:

答案 0 :(得分:1)

我认为你在mysql中得到GROUP BYORDER 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>';