簡體   English   中英

SQL語句提高速度

[英]SQL statement improve for speed

我有這段代碼,從表中選擇所有用戶,還有另一個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();
}

對您的數據庫嘗試以下查詢:

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

我希望我做對了。 我沒有SQL DB在這里進行測試。 重要提示:您必須按選擇的每個字段分組,這些字段不匯總。

編輯:

如果速度不夠快,可以在signups.useridsignups.userid索引。 但是,這是假設的,因此您應該檢查查詢引擎生成的執行計划。

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

如果我很好地理解了您的問題,請初始化變量並循環增加它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM