SQL-оператор улучшит скорость - PullRequest
0 голосов
/ 02 марта 2012

У меня есть этот кусок кода, который выбирает всех пользователей из таблицы, и другой SQL-оператор, который подсчитывает количество записей для каждого пользователя.проблема, с которой я сталкиваюсь, заключается в том, что у меня есть sql в цикле foreach, что не очень хорошо для производительности, но я не смог объединить их в одном выражении.любой совет?

$query = $db->getAll("SELECT * FROM users");
foreach($query as $v){
    $tpl->setCurrentBlock('useri');
    $query2 = $db->numRows("SELECT * FROM signups AS s INNER JOIN users AS u ON s.userid=u.id WHERE u.id={$v['id']}");
    $tpl->setVariable('total',$query2);
    $tpl->setVariable($v);
    $tpl->parseCurrentBlock();
}

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Попробуйте этот запрос к вашей БД:

SELECT u.id, COUNT(s.*)
  FROM users u
    LEFT JOIN signups s ON s.userid = u.id
  GROUP BY u.id

Надеюсь, я правильно понял.У меня нет базы данных SQL, чтобы проверить это прямо здесь.Важно: Вы должны группировать по каждому выбранному вами полю, которое не является агрегированным.

Редактировать:

Если это еще недостаточно быстро, индекс на signups.useridможет помочьОднако это гипотетически, поэтому вам следует проверить план выполнения, сгенерированный вашим механизмом запросов.

1 голос
/ 02 марта 2012
$query = $db->getAll("
   SELECT u.id, u.name, COUNT(*) total
     FROM signups AS s RIGHT JOIN users AS u ON s.userid=u.id 
 GROUP BY u.id, u.name
 ORDER BY u.name
");

foreach($query as $v){
    $tpl->setCurrentBlock('useri');
    $tpl->setVariable('total', $query['total']);
    // ...
    $tpl->parseCurrentBlock();
}
0 голосов
/ 02 марта 2012

Если я хорошо понимаю вашу проблему, инициализируйте переменную и увеличивайте ее в цикле.

int i;
foreach($query as $v){
$tpl->setCurrentBlock('useri');
$query2 = $db->numRows("SELECT * FROM signups AS s INNER JOIN users AS u ON s.userid=u.id WHERE u.id={$v['id']}");
$tpl->setVariable('total',$query2);
$tpl->setVariable($v);
$tpl->parseCurrentBlock();
i++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...