2011-05-20 43 views
1

我有这个疑问:CakePHP的计算平均问题

$this->set('grades', $this->Grade->Query(" 
SELECT AVG(grade), 
sections.section_name 

FROM grades, 
sections 

WHERE sections.id = grades.section_id 

AND grades.user_id =".$id." 

GROUP BY grades.section_id")); 

,我用它来输出数据:

<?php foreach($grades as $grade): ?> 
    <tr> 
     <td><?php echo $grade['Grade']['AVG(grade)']; ?></td> 
    </tr> 
<?php endforeach;?> 

但它给了我一个“预警指标等级未找到”。我怀疑它与['AVG(grade)']有关,因为当我删除AVG(等级)时,它输出正常(显然没有avg值)

有没有人可以帮忙?

编辑

debug($grades) outputs: 

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [avg_grade] => 4.75000 
       ) 

      [sections] => Array 
       (
        [section_name] => Nederlands 
       ) 

     ) 

    [1] => Array 
     (
      [0] => Array 
       (
        [avg_grade] => 6.50000 
       ) 

      [sections] => Array 
       (
        [section_name] => Engels 
       ) 

     ) 

) 

回答

5

首先,做debug($grades)来查看平均值存储在数组结构中的哪里。您还可以在查询中将其命名为其他内容,例如SELECT AVG(grade) AS average。作为一个方面说明,你不需要使用原始查询(可能是一个偏好问题,但我倾向于尽可能避免它们)。你可以做

$this->Grade->find(
    'all', 
    array(
    'conditions' => array(
     'Grade.user_id' => $id 
    ), 
    'recursive' => 1, 
    'fields' => array( 
     'AVG(Grade.grade) AS average', 
     // +whatever else you need 
    ) 
    'group' => 'Grade.section_id' 
) 
); 

在这种情况下,当你做foreach($grades as $grade)的平均值将在$grade[0]['average']

+0

非常感谢你!它的工作。 – DaDu 2011-05-20 11:05:50

0

做一个SELECT AVG(grade) AS avg_grade这将作为
$grades['Grade']['avg_grade']

+0

Stil给我指数等级找不到警告。有没有一个cakephp aproach做同样的查询? – DaDu 2011-05-20 10:40:01

+1

它的'$等级['等级']'(s!)而不是'$等级['等级']'!您正在查看错误的PHP变量! – powtac 2011-05-20 10:42:07

+0

是的,你总是可以打印出整个变量来查看结构是什么。 'debug()'是CakePHP必须提供的最有用的函数。 – JJJ 2011-05-20 10:52:04

0

下面CakePHP中3.5

//用户对我的查询工作是我的表
//默认情况下,用户的评价将是0 that`s为什么设置where子句> 0

$query = $this->Users->find(); 

$ratingAverage = $query->select(['averageRating' => $query->func()->avg('user_rating')]) 
->where(['user_rating' => $userId,'provider_rating >' => 0])->group('user_rating')->first(); 

Refer here