我有一个名为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查询
答案 0 :(得分:2)
答案 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的结构,例如它是如何编入索引的。