MySQL内部查询,在cakephp中使用Where和Group by条件

时间:2009-10-12 09:22:12

标签: mysql cakephp

我有一个名为Reports with

的表
 id report_id user_id 
  1     1       5
  2     1       5
  3     1       5
  4     2       5
  5     2       5
  6     3       6
  7     3       6
  8     4       1
  9     4       1
 10     4       1     

我正在尝试编写一个查询,使user_id = 5并查找他创建了多少报告。(答案应为2)

我写了一个Mysql查询

  select count(distinct report_id) from Reports where user_id=5

我在Foreach用户循环中尝试相同的MYSQl子查询,其中我的5来自$ user ['User'] ['id'];

如何在cakephp Framework中的for循环中编写上面的MYSQL查询....

          foreach($users as & $user):

                echo "User id ".$user['User']['id'];

            $user['User']['report_count'] = $this->Report->find('count',
            array('conditions'=>array('Report.user_id'=>$user['User']['id'])));


        endforeach;

         $this->set('users', $users);

请建议我.......请在cakephp中写上面的Mysql查询

3 个答案:

答案 0 :(得分:2)

您想使用以下功能GROUP BYCOUNT

您的查询可能看起来像这样

select count(distinct report_id) from Reports where user_id=5

答案 1 :(得分:1)

如果这是您在应用程序中显示的用户列表...您可以显着减少正在运行的查询数量。 例如。对于100个用户,您将运行100个查询,而不是运行单个查询来提取每个用户的user_id和报告计数

select count(distinct report_id) as count,user_id from Reports where user_id IN (1,2) GROUP BY user_id;

如果您想为每个用户运行单独的查询

select count(distinct report_id) as count,user_id from Report where user_id=5;

答案 2 :(得分:0)

试试这个:

$user['User']['report_count'] = $this->Report->find('count',
    array( 'conditions' => array('Report.user_id' => $user['User']['id']),
        'fields' => 'DISTINCT Report.report_id'
    )
);

它应该为给定的report_id获取所有不同的user_id,然后计算它们。基本上,它应该运行查询:

SELECT DISTINCT report_id FROM Reports WHERE user_id=$user['User']['id']

(在替换$user['User']['id']的值之后),然后计算结果中的行数。警告:我在现实生活中不使用CakePHP,我只读了documentation;你的旅费可能会改变。正如halocursed所提到的,自己运行单个SQL query比为每个用户ID调用find(...)更有效。你也可以尝试:

$report_counts = $this->Report->find('list',
    array( 'conditions' => array('Report.user_id' => array_map(create_function('$user', 'return $user["User"]["id"];'), $users)),
        'group'  => array('Report.user_id'),
        'fields' => array('Report.user_id', 'COUNT(DISTINCT Report.report_id) AS report_count')
    )
);
foreach ($users as &$user) {
    $user['User']['report_count'] = $report_counts[$user['User']['id']];
}

但是,我不知道CakePHP是否会接受'fields'参数中的聚合函数,我不知道find('list', ...)会选择Report.user_id作为数组索引。如果您遇到后者问题,可以切换到[find('all', ...)][3]来电并循环$report_counts而不是$users。我没有采用这种方法,因为我不知道$ users的结构,例如它是如何编入索引的。