Php SQL语句提高了速度

Php SQL语句提高了速度,php,sql,foreach,Php,Sql,Foreach,我有一段代码从表中选择所有用户,还有另一条sql语句统计每个用户的记录数。我面临的问题是,我在foreach循环中有一个sql,这对性能不好,但我无法将这两个语句组合在一个语句中。有什么建议吗 $query = $db->getAll("SELECT * FROM users"); foreach($query as $v){ $tpl->setCurrentBlock('useri'); $query2 = $db->numRows("SELECT * FRO

我有一段代码从表中选择所有用户,还有另一条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();
}

若我很好地理解了你们的问题,那个么初始化变量并在循环中增加它

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

若我很好地理解了你们的问题,那个么初始化变量并在循环中增加它

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

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

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
上的索引可能会有所帮助。但是,这是假设,因此您应该检查查询引擎生成的执行计划。

尝试对数据库执行此查询:

SELECT u.id, COUNT(s.*)
  FROM users u
    LEFT JOIN signups s ON s.userid = u.id
  GROUP BY u.id
$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();
}
我希望我做对了。我这里没有SQL DB来测试它。重要提示:您必须按您选择的每个非聚合字段进行分组

编辑:


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

请同时包括用户表和注册表的表结构。请同时包括用户表和注册表的表结构。我想将sql语句移到循环之外,因为如果我有1000k查询,我想将sql语句移到循环之外,因为如果我有1000k个查询,则需要很长时间才能记住,
内部连接
会忽略没有相应注册的
用户
行,而不是计数为零。请记住,
内部连接
会忽略没有相应注册的
用户
signups
而不是使用计数为零的方法。我有一个关于signups的索引。userid查询需要0.0009秒我有一个关于signups的索引。userid查询需要0.0009秒
$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();
}