获取不同的值,以及该特定值的计数并将其显示在数组中

时间:2013-06-02 05:32:22

标签: cakephp

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

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

我想要关注的是“记录”表中称为“实体”的字段。该字段显然具有由网站的不同成员重复多次的相同值。

示例:

物质 X X ÿ C C C d

如你所见,x重复两次,y,一次,c,三次,d,一次。

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

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

我假设我必须使用DISTINCT和SUM?但我真的不知道该怎么做。

感谢无论谁提供帮助

3 个答案:

答案 0 :(得分: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')));

答案 1 :(得分:0)

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

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

如果您可能的物质未知,您可以先做:

$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'
    )
  ),
);

希望这有帮助。

答案 2 :(得分: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']

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