0

我对 cakephp 的理解非常温和,但我一直无法解决我遇到的这个问题。

对于我的网站,人们将能够存储他们使用过的某些物质的日志。稍后我将使用这些数据(匿名)将图表和统计数据显示回网站。现在我所有的数据都存储在一个名为“记录”的表中,并且我已经设置了我的组件/模型。

我要关注的是“记录”表中名为“物质”的字段,该字段显然具有相同的值,该值会被网站的不同成员多次重复。

例子:

物质 x x y c c c d

如您所见,x 重复了两次,y 重复一次,c 重复了 3 次,d 重复了一次。

我需要 cakePHP 来查询这个表并显示一个数组

['x', '2'],
['y', '1'],
['c', '3'],
['d', '1']

我想我将不得不使用 DISTINCT 和 SUM?但我真的不知道该怎么做。

感谢任何可以提供帮助的人

4

3 回答 3

0
foreach($possibleSubstance as $substance){
  $conditions = array(
    'Record.substance' => $substance
  );
  $result[$substance] = $this->Record->find('count', array('conditions' => $conditions));
}

$result 将是一个数组 ['x'] => #, ['y'] => # 等等。

如果您可能的物质未知,您可以先通过以下方式获取它们:

$fields = 'DISTINCT Record.substance';
$possibleSubstances = $this->find('all', array('fields' => $fields));

这将创建一个数组:

$possibleSubstances = array(
  (int) 0 => array(
    'Record' => array(
      'substance' => 'x'
    )
  ),
  (int) 1 => array(
    'Record' => array(
      'substance' => 'y'
    )
  ),
);

希望这可以帮助。

于 2013-06-02T12:06:11.610 回答
0

为什么不使用文档中的虚拟字段? http://book.cakephp.org/2.0/en/models/virtual-fields.html

$this->Record->virtualFields['sum'] = 'COUNT(*)';

// now sum is a field automatically, as well
$grouped = $this->Record->find('all', array(
    'group' => 'Record.substance');

获取所有记录,甚至作为列表(根据您的要求):

$grouped = $this->Record->find('list', array(
    'fields' => array('Record.substance', 'Record.sum'),
    'group' => 'Record.substance');

这将返回您的数组:

['x', '2'],
['y', '1'],
['c', '3'],
['d', '1']

最干净的方法。当然,您也可以通过“物质”或“总和”来订购它。

于 2013-06-02T14:36:55.960 回答
0

您正在寻找的基本 SQL 查询是

SELECT substance, COUNT(*)
  FROM records
 GROUP BY substance

这是SQLFiddle

我不是 cakephp 方面的专家,但它可能看起来像

$result = $this->Record
    ->find('all', 
           array('fields' => array('Record.substance', 'COUNT(*)'),
                 'group'  => array('Record.substance')));
于 2013-06-02T06:44:04.753 回答