mysqli - 有多少(非常慢)

时间:2012-10-20 06:15:45

标签: php mysql mysqli

我有一个调查页面 - 基于您对之前问题的回答显示并使用jquery隐藏其他问题(这些问题因所有输入类型而异)我有一个保存功能,然后是保存和提交功能 - 保存时并提交我需要验证所有尚未隐藏的问题已经得到解答 - 在输出原型中测试语法我意识到我运行的大量mysqli查询减慢了页面(可能超过300个问题或者短于10)

我们在下面查询的是查询为此调查分配了多少问题(sid,$ surveyid),$ qcountup是我使用while语句访问1和最高问题编号之间的每个数字的方法( $ QTOTAL) 我们在运行查询时查看是否存在对于数据库中每个数字的答案(如果没有得到答案 - 它不会存在),那么我们将继续查看正在重新运行的每个数字从1 - $ qtotal的while语句。 再次如何编码目前可能意味着300+ mysqli查询(LAG)。关于如何缩小或写得更好的任何建议?

    $qquery = "SELECT * FROM question WHERE (sid = ".$surveyid.");";
$qresult = mysqli_query($dbc, $qquery);
$qtotal = mysqli_num_rows($qresult);
$qcountup = 1;
while($qcountup <= $qtotal){
$squery = "SELECT * FROM answers WHERE sid='".$SID."' AND question='".$qcountup."';";
$sresult = mysqli_query($dbc, $squery) or die(mysql_error());
if (mysqli_num_rows($sresult) )
{
echo("<br>row existed");
} else {
echo("<br>row doesn't exist");
}     
$qcountup = $qcountup + 1;    
}

1 个答案:

答案 0 :(得分:1)

首先,由于你使用的是mysqli,你应该使用准备好的查询,而不是直接将变量插入到查询字符串中。

第一个查询应该是:

SELECT COUNT(*) qtotal FROM question WHERE sid = "$surveyid"

如果您只对该号码感兴趣,则无需获取所有列。将$qtotal设置为此结果的qtotal列。

对于第二部分,您可以使用LEFT JOIN来匹配问题与答案,并查看缺少哪些答案:

SELECT * FROM questions q LEFT JOIN answers a USING (question, sid)
WHERE q.sid = $SID
ORDER BY q.question

如果缺少答案,则该行中的a.question将为NULL。

我不确定我是否应该在那里使用$ SID或$ surveyid;您的原始代码在不同的查询中使用。