SQL语句提高了速度

时间:2012-03-02 07:53:59

标签: php sql foreach

我有这段代码从表中选择所有用户,另一个sql语句计算每个用户的记录数。我面临的问题是我在foreach循环中有一个sql,这对性能不利但我无法在一个语句中将它们组合在一起。任何建议?

$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 个答案:

答案 0 :(得分:3)

针对您的数据库尝试此查询:

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

我希望我做对了。我没有SQL DB来测试它。重要提示:您必须按所选的每个不合并的字段进行分组。

修改

如果还不够快,signups.userid上的索引可能会有所帮助。但这是假设,因此您应该检查查询引擎生成的执行计划。

答案 1 :(得分:1)

$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();
}

答案 2 :(得分:0)

如果我理解你的问题,初始化变量并在循环中增加它。

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++;
}