MySQL Внутренний Запрос с Где и Группой по условиям в cakephp - PullRequest
0 голосов
/ 12 октября 2009

У меня есть таблица с именем Reports с

 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 Query как

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

Я пытаюсь выполнить тот же подзапрос MYSQl в цикле пользователей Foreach, где мой 5 от $ user ['User'] ['id'];

как написать запрос MYSQL выше внутри этого цикла for в cakephp Framework ....

          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);

Пожалуйста, предложите мне ....... КАК написать вышеупомянутый Mysql Query в cakephp

Ответы [ 3 ]

2 голосов
/ 12 октября 2009

Вы хотите использовать следующие функции GROUP BY и COUNT

Ваш запрос может выглядеть примерно так

select count(distinct report_id) from Reports where user_id=5
1 голос
/ 12 октября 2009

Если это список пользователей, которые вы показываете в своем приложении ... вы можете значительно сократить количество выполняемых запросов. например. для 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;
0 голосов
/ 12 октября 2009

Попробуйте это:

$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 в реальной жизни, я просто прочитал документацию ; Ваш пробег может варьироваться. Как уже упоминалось в галокурсе, выполнение одного запроса SQL самостоятельно будет более эффективным, чем вызов 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, например, как она проиндексирована.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...