【问题标题】:Cakephp calculating average problemCakephp计算平均问题
【发布时间】:2011-05-20 10:27:52
【问题描述】:

我有这个问题:

   $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(grade) 它输出正常(显然没有平均值)

有人可以帮忙吗?

编辑

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
                )

        )

)

【问题讨论】:

    标签: php sql cakephp average


    【解决方案1】:

    首先,执行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']

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Stil 给了我未找到索引等级的警告。是否有 cakephp 方法来执行相同的查询?
      • 它的$grades['Grade'](s!)不是$grade['Grade']!您正在查看错误的 PHP 变量!
      • 是的,您可以随时打印出整个变量以查看结构是什么。 debug() 是 CakePHP 必须提供的最有用的函数。
      • 当我 print_r($grades) 它显示平均成绩。所以代码有效,但它仍然给我未定义的索引。 :(
      • 我用... 就像你告诉我的那样。
      【解决方案3】:

      以下查询在 cakephp 3.5 中为我工作

      // 用户是我的表
      // 默认情况下,用户评分在表中为 0,这就是为什么设置 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 2015-09-13
        • 2020-07-31
        • 1970-01-01
        • 2015-01-07
        • 1970-01-01
        相关资源
        最近更新 更多