我对cakephp有一个非常温和的理解,但我无法解决这个问题。
对于我的网站,人们可以存储他们使用的某些物质的日志。我稍后会使用这些数据(匿名)将图表和统计数据显示回网站。现在我的所有数据都存储在一个名为“Records”的表中,我已经设置了组件/模型。
我想要关注的是“记录”表中称为“实体”的字段。该字段显然具有由网站的不同成员重复多次的相同值。
示例:
物质 X X ÿ C C C d
如你所见,x重复两次,y,一次,c,三次,d,一次。
我需要cakePHP来查询这个表并显示一个数组
['x', '2'],
['y', '1'],
['c', '3'],
['d', '1']
我假设我必须使用DISTINCT和SUM?但我真的不知道该怎么做。
感谢无论谁提供帮助
答案 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']
最干净的方法。 当然,您也可以通过“实质”或“总和”来订购。