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